HDOJ---3790 最短路径问题[Dijkstra算法||SPFA]
2012-08-03 23:42
567 查看
最短路径问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4820 Accepted Submission(s): 1446
[align=left]Problem Description[/align]
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
[align=left]Input[/align]
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
[align=left]Output[/align]
输出 一行有两个数, 最短距离及其花费。
[align=left]Sample Input[/align]
3 2 1 2 5 6 2 3 4 5 1 3 0 0
[align=left]Sample Output[/align]
9 11
[align=left]Source[/align]
浙大计算机研究生复试上机考试-2010年
[align=left]Recommend[/align]
notonlysuccess
前面一直WA,后来才发现不能用INT_MAX来赋值,还找了好久的问题,以后注意了!!!
code:
#include <iostream> #include <iomanip> #include <fstream> #include <sstream> #include <algorithm> #include <string> #include <set> #include <utility> #include <queue> #include <stack> #include <list> #include <vector> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <ctype.h> using namespace std; #define MAXN 1010 int n,m; int s,t; int dist[MAXN]; int disc[MAXN]; int mapt[MAXN][MAXN]; int mapc[MAXN][MAXN]; int vst[MAXN]; void Dijkstra() { int i,j,k; for(i=1;i<=n;i++) { dist[i]=mapt[s][i]; disc[i]=mapc[s][i]; vst[i]=0; } vst[s]=1; dist[s]=0; disc[s]=0; for(i=2;i<=n;i++) { k=s; int lowdis=99999; for(j=1;j<=n;j++) if(!vst[j]&&dist[j]<lowdis) { k=j; lowdis=dist[j]; } if(lowdis==99999) break; vst[k]=1; for(j=1;j<=n;j++) { if(!vst[j]) { if(dist[j]>mapt[k][j]+dist[k]) { dist[j]=mapt[k][j]+dist[k]; disc[j]=mapc[k][j]+disc[k]; } else if(dist[j]==mapt[k][j]+dist[k]) { if(disc[j]>mapc[k][j]+disc[k]) disc[j]=mapc[k][j]+disc[k]; } } } } } int main() { int i,j; int a,b,d,p; while(~scanf("%d%d",&n,&m),n&&m) { for(i=1;i<=MAXN;i++) for(j=1;j<=MAXN;j++) { mapt[i][j]=99999; mapc[i][j]=99999; } for(i=1;i<=m;i++) { scanf("%d%d%d%d",&a,&b,&d,&p); if(d<mapt[a][b]) { mapt[a][b]=mapt[b][a]=d; mapc[a][b]=mapc[b][a]=p; } else if(d==mapt[a][b]) { if(p<mapc[a][b]) mapc[a][b]=mapc[b][a]=p; } } scanf("%d%d",&s,&t); Dijkstra(); printf("%d %d\n",dist[t],disc[t]); } return 0; }
SPFA
code:
#include <iostream> #include <iomanip> #include <fstream> #include <sstream> #include <algorithm> #include <string> #include <set> #include <utility> #include <queue> #include <stack> #include <list> #include <vector> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <ctype.h> using namespace std; #define MAXN 1010 #define intmax 99999999 int map[MAXN][MAXN]; int dis[MAXN]; int cost[MAXN][MAXN]; int QM[MAXN]; int px[MAXN]; //费用 int n,m; void init() { int i,j; for(i=1;i<=n;i++) { QM[i]=0; px[i]=dis[i]=intmax; for(j=1;j<=n;j++) cost[i][j]=map[i][j]=intmax; } } void spfa(int sx,int ex) { int i,j; queue<int>Que; int temp; Que.push(sx); QM[sx]=1; dis[sx]=0; px[sx]=0; while(!Que.empty()) { temp=Que.front(); Que.pop(); QM[temp]=0; for(i=1;i<=n;i++) { if(dis[i]>dis[temp]+map[temp][i]) { dis[i]=dis[temp]+map[temp][i]; px[i]=px[temp]+cost[temp][i]; if(QM[i]==0) { QM[i]=1; Que.push(i); } } else if(dis[i]==dis[temp]+map[temp][i]&&px[i]>px[temp]+cost[temp][i]) { px[i]=px[temp]+cost[temp][i]; } } } printf("%d %d\n",dis[ex],px[ex]); } int main() { int a,b,d,p; while(~scanf("%d%d",&n,&m),n||m) { init(); for(int i=1;i<=m;i++) { scanf("%d%d%d%d",&a,&b,&d,&p); if(d<map[a][b]) { map[a][b]=map[b][a]=d; cost[a][b]=cost[b][a]=p; } } int st,et; scanf("%d%d",&st,&et); spfa(st,et); } return 0; }
相关文章推荐
- HDOJ 3790 最短路径问题(dijkstra算法)
- HDOJ 3790 最短路径问题 (dijkstra算法的优化,优先队列)
- HDOJ 3790 最短路径问题 SPFA
- HDU 3790 最短路径问题(双重Dijkstra算法)
- hdoj 3790 最短路径问题(双重松弛)
- 九度OJ108 HDOJ3790:最短路径问题 迪杰斯特拉算法
- HDOJ 3790 最短路径问题
- HDOJ 3790 最短路径问题 (最短路 && Dijkstra && 双权值)
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
- HDU 3790 最短路径问题 (SPFA)
- HDOJ 3790 最短路径问题(最短路的路径追踪)
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
- HDU 3790.最短路径问题【最短路径Dijkstra算法】【4月14】
- HDOJ 3790 最短路径问题(双关键字最短路)
- hdu-3790-最短路径问题(dijkstra算法)
- HDOJ题目3790最短路径问题(最短路径,Dijkstra双权值)
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
- hdu 3790 最短路径问题 spfa
- HDOJ 3790 最短路径问题
- hdoj 3790 最短路径问题