题目1 : 最短路径·三:SPFA算法
来源:互联网 发布:淘宝详情页图片模板 编辑:程序博客网 时间:2024/05/02 02:49
题目1 : 最短路径·三:SPFA算法
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
- 样例输入
5 10 3 51 2 9972 3 5053 4 1184 5 543 5 4803 4 7965 2 7942 5 1465 4 6042 5 63
- 样例输出
172
描述
万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋!
鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路。
不过这个鬼屋虽然很大,但是其中的道路并不算多,所以小Hi还是希望能够知道从入口到出口的最短距离是多少?
提示:Super Programming Festival Algorithm。输入
每个测试点(输入文件)有且仅有一组测试数据。
在一组测试数据中:
第1行为4个整数N、M、S、T,分别表示鬼屋中地点的个数和道路的条数,入口(也是一个地点)的编号,出口(同样也是一个地点)的编号。
接下来的M行,每行描述一条道路:其中的第i行为三个整数u_i, v_i, length_i,表明在编号为u_i的地点和编号为v_i的地点之间有一条长度为length_i的道路。
对于100%的数据,满足N<=10^5,M<=10^6, 1 <= length_i <= 10^3, 1 <= S, T <= N, 且S不等于T。
对于100%的数据,满足小Hi和小Ho总是有办法从入口通过地图上标注出来的道路到达出口。
输出
对于每组测试数据,输出一个整数Ans,表示那么小Hi和小Ho为了走出鬼屋至少要走的路程。
#include <cstdio>#include <iostream>#include <cstring>#include <queue>using namespace std;const int MAXN = 100005;const int INF = 0x3f3f3f3f;typedef struct node{int v;int w;struct node * nptr;}node;int n, m, s, t;node * h[MAXN];queue<int> Q;void compareVal(int u, int v, int w){node * tptr = h[u]; while(tptr != NULL){ if(tptr->v==v && tptr->w>w){ tptr->w = w; break; } tptr = tptr->nptr; } if(tptr == NULL){ tptr = new node; tptr->v = v; tptr->w = w; tptr->nptr = h[u]; h[u] = tptr; }}void SPFA(int s){ int dist[MAXN], inq[MAXN], u; node * ptr; for(int i=0;i<MAXN;i++){ dist[i] = INF; inq[i] = 0; } dist[s] = 0; inq[s] = 1; Q.push(s); while(!Q.empty()){u = Q.front();Q.pop();inq[u] = 0; ptr = h[u]; while(ptr!=NULL){ if(dist[u]+ptr->w<dist[ptr->v]){dist[ptr->v] = dist[u]+ptr->w; if(!inq[ptr->v]){Q.push(ptr->v); inq[ptr->v] = 1;} } ptr = ptr->nptr; } } printf("%d\n", dist[t]);}int main(){memset(h, NULL, sizeof(h)); scanf("%d %d %d %d", &n, &m, &s, &t); for(int i=0;i<m;i++){ int u, v, w; scanf("%d %d %d", &u, &v, &w); compareVal(u, v, w); compareVal(v, u, w); } SPFA(s);return 0;}
代码二(效率更高):
#include <cstdio>#include <iostream>#include <cstring>#include <queue>using namespace std;const int MAXN = 100005;const int INF = 0x3f3f3f3f;typedef struct edge{int v;int w;int next;}edge;edge e[20*MAXN];int n, m, s, t;int h[MAXN], NE;queue<int> Q;void compareVal(int u, int v, int w){int i = -1;for(i=h[u];i!=-1;i=e[i].next){ if(e[i].v==v && e[i].w>w){ e[i].w = w; break; }} if(i==-1){ e[NE].v = v; e[NE].w = w; e[NE].next = h[u]; h[u] = NE++; }}void SPFA(int s){ int dist[MAXN], inq[MAXN], u; for(int i=0;i<MAXN;i++){ dist[i] = INF; inq[i] = 0; } dist[s] = 0; inq[s] = 1; Q.push(s); while(!Q.empty()){u = Q.front();Q.pop();inq[u] = 0; for(int i=h[u];i!=-1;i=e[i].next){ if(dist[u]+e[i].w<dist[e[i].v]){dist[e[i].v] = dist[u]+e[i].w;if(!inq[e[i].v]){ Q.push(e[i].v); inq[e[i].v] = 1;} } } } printf("%d\n", dist[t]);}int main(){memset(h, -1, sizeof(h)); scanf("%d %d %d %d", &n, &m, &s, &t); for(int i=0;i<m;i++){ int u, v, w; scanf("%d %d %d", &u, &v, &w); compareVal(u, v, w); compareVal(v, u, w); } SPFA(s);return 0;}
0 0
- 题目1 : 最短路径·三:SPFA算法
- hihoCoder 1093 : 最短路径·三:SPFA算法
- hihoCoder#1093 最短路径·三-SPFA算法
- hihoCoder 1093 最短路径·三:SPFA算法
- # hihocoder #1093 : 最短路径·三:SPFA算法
- hihocoder 1093 : 最短路径·三:SPFA算法
- hihocoder #1093 : 最短路径·三:SPFA算法
- hihoCoder - 1093 - 最短路径·三:SPFA算法
- HIHO #1093 : 最短路径·三:SPFA算法
- hihoCoder 1093 : 最短路径·三:SPFA算法
- hihocoder 1093 : 最短路径·三:SPFA算法
- hihocoder#1093 : 最短路径·三:SPFA算法
- hihoCoder - 1093 - 最短路径·三:SPFA算法 (SPFA)
- 最短路径算法---SPFA
- 最短路径----SPFA算法
- 【最短路径】SPFA算法
- SPFA算法【最短路径】
- 最短路径SPFA算法
- UIWebView---UIWebView和JavaScript交互
- 深圳南湾刨花板厂有几家呢
- Android sqlite db-journal文件的产生和原因
- 沙井刨花板哪家质量好呢
- Ucinet学习笔记一:DL Input
- 题目1 : 最短路径·三:SPFA算法
- 59. Spiral Matrix II Leetcode Python
- hdu 1158 简单dp
- 利用C/C++扩展php语言实现 Usher_GetHostIP无参函数
- 入门训练 序列求和
- 10-2. 删除字符串中的子串(20)
- 【C++】OJ提交题目中的语言选项里G++与C++的区别
- LightOJ - 1174 Commandos
- IOS中点语法的变态用法(我叫做不法用法)