最短路 【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; }
相关文章推荐
- Java读取资源文件
- DirectShow视频采集(重要)
- C++之程序时间统计类实现
- hdu5412(动态区间第k大)
- 【Windows编程】系列第十篇:文本插入符
- leetcode之路027 Remove Element
- android:TextAppearance.Material.Widget.Button.Inverse找不到或者报错问题
- dx wpf的各种坑
- 【Windows编程】系列第十篇:文本插入符
- 洛谷2296 寻找道路
- ios线程-常用方法
- java多线程总结
- asio bind
- 面向对象小结
- 强名称程序集(strong name assembly)——为程序集赋予强名称
- Android-本地启动服务的方法及调用方法的顺序
- 以前是行不通的,做事先做人
- How To Configure BIND as a Private Network DNS Server on Ubuntu 14.04
- linux总结应用之三 安装和配置串行,并行链路
- Cocos2d-JS win32 获取远程图片失败