poj 2387最短路 使用SPFA
2017-08-16 15:52
309 查看
题意即在求图中N到1的最短路,就在这里我第一次使用了SPFA算法(雾
SPFA算法求单源最短路
即初始化该点到其它个点的数组 D 为一个 ‘ 无穷大’ 值
将源点放入队列队首,而后执行以下操作,直到队列为空:
取出队首,遍历与队首点邻接的所有点,记队首为u,另一点为v,
若D[v] > D[u] + w[u,v],那么就更新D[v]为D[u] + w[u,v],且当v不在队列中就将其加入队列
最终得到一个源点到其它各点的最短路数组D
当然,这个算法的前提是边权值非负
ac代码如下(重边真是坑)
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
#define MAXN 1<<20
int mapp[1005][1005];
int SPFA(int b, int e,int N)
{
int road[1005];
int inQueue[1005];
memset(inQueue,0,sizeof(inQueue));
for(int i=1;i<=N;++i) road[i]=MAXN;
road[b] = 0;
queue<int> spf;
spf.push(b);
inQueue[b]=1;
while(!spf.empty())
{
int u = spf.front();
spf.pop();
inQueue[u] = 0;
for(int i=1;i<=N;++i)
if(mapp[u][i]&&road[i]>road[u]+mapp[u][i])
{
road[i]=road[u]+mapp[u][i];
if(inQueue[i]==0) { spf.push(i); inQueue[i]=1;}
}
}
return road[e];
}
int main()
{
int N, T;
while(cin>>T>>N)
{
memset(mapp,0,sizeof(mapp));
for(int i=1;i<=T;++i)
{
int u, v, r;
cin>>u>>v>>r;
if(mapp[u][v]==0) mapp[u][v]=mapp[v][u]=r; //重边的坑
else mapp[u][v]=mapp[v][u]=mapp[v][u]>r?r:mapp[v][u];
}
cout<<SPFA(N, 1, N)<<endl;
}
return 0;
}
SPFA算法求单源最短路
即初始化该点到其它个点的数组 D 为一个 ‘ 无穷大’ 值
将源点放入队列队首,而后执行以下操作,直到队列为空:
取出队首,遍历与队首点邻接的所有点,记队首为u,另一点为v,
若D[v] > D[u] + w[u,v],那么就更新D[v]为D[u] + w[u,v],且当v不在队列中就将其加入队列
最终得到一个源点到其它各点的最短路数组D
当然,这个算法的前提是边权值非负
ac代码如下(重边真是坑)
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
#define MAXN 1<<20
int mapp[1005][1005];
int SPFA(int b, int e,int N)
{
int road[1005];
int inQueue[1005];
memset(inQueue,0,sizeof(inQueue));
for(int i=1;i<=N;++i) road[i]=MAXN;
road[b] = 0;
queue<int> spf;
spf.push(b);
inQueue[b]=1;
while(!spf.empty())
{
int u = spf.front();
spf.pop();
inQueue[u] = 0;
for(int i=1;i<=N;++i)
if(mapp[u][i]&&road[i]>road[u]+mapp[u][i])
{
road[i]=road[u]+mapp[u][i];
if(inQueue[i]==0) { spf.push(i); inQueue[i]=1;}
}
}
return road[e];
}
int main()
{
int N, T;
while(cin>>T>>N)
{
memset(mapp,0,sizeof(mapp));
for(int i=1;i<=T;++i)
{
int u, v, r;
cin>>u>>v>>r;
if(mapp[u][v]==0) mapp[u][v]=mapp[v][u]=r; //重边的坑
else mapp[u][v]=mapp[v][u]=mapp[v][u]>r?r:mapp[v][u];
}
cout<<SPFA(N, 1, N)<<endl;
}
return 0;
}
相关文章推荐
- poj 2387 Til the Cows Come Home(最短路SPFA+Dijkstra)
- poj 2387 最短路 spfa 实现
- POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)
- Til the Cows Come Home POJ - 2387 单源最短路 SPFA实现
- poj 2387 Til the Cows Come Home 最短路(贝尔曼,迪杰斯特拉,spfa)
- POJ 2387 Til the Cows Come Home (单源最短路SPFA解法)
- poj-2387 Til the Cows Come Home(最短路-spfa)
- 最短路--poj2387
- POJ 2387 最短路 贝尔曼福特和迪杰斯特拉双解
- poj 1724 spfa(有费用上限的最短路(双重标准最短路))
- POJ 1847 Tram --set实现最短路SPFA
- POJ 3013 Big Christmas Tree (SPFA最短路)
- poj 2387 Til the Cows Come Home spfa基础题,入门,我的第一个
- poj 2387 Til the Cows Come Home (最短路)
- POJ 3159 Candies差分约束系统 spfa 附:各种最短路比较
- POJ2949-平均最短路SPFA
- poj——2387——Til the Cows Come Home(简单最短路)
- POJ 2387 Til the Cows Come Home(最短路模板)**
- POJ 2387 Til the Cows Come Home【最短路】
- POJ 2387 Til the Cows Come Home(迪杰斯特拉/优先队列/最短路)