您的位置:首页 > 其它

最短路 【spfa】 模板

2015-08-20 21:24 330 查看
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#define MAXN 100+10//点数
#define MAXM 20000+10//边数
#define INF 0x3f3f3f
using namespace std;
struct Edge
{
int from, to, val, next;
};
Edge edge[MAXM];
int head[MAXN], edgenum;
int N, M;
void addEdge(int u, int v, int w)
{
Edge E = {u, v, w, head[u]};
edge[edgenum] = E;
head[u] = edgenum++;
}
void init()
{
edgenum = 0;
memset(head, -1, sizeof(head));
}
int dist[MAXN];//存储源点 到这个点的最短路
int vis[MAXN];//表示这个点是否在队列里面
int used[MAXN];//记录一个点 入队多少次
void SPFA(int sx)//sx为源点
{
queue<int> Q;//存储每次入队的点
memset(dist, INF, sizeof(dist));
memset(vis, 0, sizeof(vis));
memset(used, 0, sizeof(used));
Q.push(sx);
dist[sx] = 0;
vis[sx] = 1;
used[1]++;
while(!Q.empty())
{
int u = Q.front();//N
Q.pop();
vis[u] = 0;
for(int i = head[u]; i != -1; i = edge[i].next)//遍历以u为起点的 所有边
{
int v = edge[i].to;
if(dist[v] > dist[u] + edge[i].val)//
{
dist[v] = dist[u] + edge[i].val;
if(!vis[v])
{
vis[v] = 1;
Q.push(v);
used[v]++;
if(used[v] > N)//图中有负环
return;

}
}
}
}
printf("%d\n", dist
);
}
void getMap()
{
int a, b, c;
while(M--)
{
scanf("%d%d%d", &a, &b, &c);
addEdge(a, b, c),
addEdge(b, a, c);
}
}
int main()
{
while(scanf("%d%d", &N, &M), N||M)
{
init();
getMap();
SPFA(1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: