蓝桥杯 道路和航路(SPFA算法求最短路径)
2014-07-17 20:35
330 查看
//蓝桥杯 道路和航路 (SPFA算法求最短路径) //超时的两组数据 #include<iostream> #include<cstdio> #include<string.h> #include<queue> using namespace std; const int N=30000; const int Inf=100000000; struct node { int to; int value; int next; }; int head ; int vis ;// int dis ={0};//存取距离 int t,r,P,s; node p[N*6]; void init() { memset(head,-1,sizeof(head[0])*(t+2)); memset(vis,0,sizeof(vis[0])*(t+2)); int k=0; int a,b,c; for(int i=0;i<r;i++) { scanf("%d%d%d",&a,&b,&c); p[k].to=b; p[k].value=c; p[k].next=head[a]; head[a]=k++; p[k].to=a; p[k].value=c; p[k].next=head[b]; head[b]=k++; } for(int i=0;i<P;i++) { scanf("%d%d%d",&a,&b,&c); p[k].to=b; p[k].value=c; p[k].next=head[a]; head[a]=k++; } } //============关键算法=================== bool relax(int pr,int to,int value) { if(dis[to]>dis[pr]+value) { dis[to]=dis[pr]+value; return true; } return false; } int SPAF(int d) { for(int i=0;i<=t;i++) { dis[i]=Inf; } vis[d]=1; dis[d]=0; queue<int> que; que.push(d); while(!que.empty()) { int pre=que.front(); que.pop(); vis[pre]=0; for(int i=head[pre];i+1;i=p[i].next) { if(relax(pre,p[i].to,p[i].value)&&!vis[p[i].to]) { que.push(p[i].to); vis[p[i].to]=1; } } } } //========================================== int main() { scanf("%d%d%d%d",&t,&r,&P,&s); init(); SPAF(s); for(int i=1;i<=t;i++) { if(dis[i]==Inf) { printf("NO PATH\n"); } else { printf("%d\n",dis[i]); } } return 0; }
相关文章推荐
- 蓝桥杯 最短路 道路和航路 SPFA算法
- 蓝桥杯--算法练习:最短路(单源最短路径spfa算法)
- 最短路径——SPFA算法(蓝桥杯试题集)
- 单源最短路径之SPFA算法实现
- SPFA算法(最短路径)
- 单源最短路径的SPFA算法
- 最短路径·三:SPFA算法 HihoCoder - 1093 (spfa无向图)
- 最短路径之SPFA算法
- 单元最短路径--SPFA算法
- hihocoder#1093 : 最短路径·三:SPFA算法
- 图论-最短路径--3、SPFA算法O(kE)
- 邻接表实现 单源最短路径SPFA算法
- 单源最短路径:SPFA算法
- (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍
- SPFA算法求单源最短路径
- 最短路径:我的理解--SPFA算法
- hihoCoder 1093 : 最短路径·三:SPFA算法
- 最短路径 之 SPFA算法
- hihocoder #1093 : 最短路径·三:SPFA算法
- HIHO #1093 : 最短路径·三:SPFA算法