POJ 1847 最短路问题 dijkstra算法的实现
2010-11-25 22:30
337 查看
首先自己练习了一下实现dijkstra算法,可以把dj算法与prim算法对比记忆,要理解pre数组、min数组、V标记数组的含义!
从网上看到某大牛用Floyd算法的思想也得以解决
//单源最短路径,dijkstra算法,邻接阵形式,复杂度O(n^2) //求出源s到所有点的最短路经,传入图的顶点数n,(有向)邻接矩阵mat //返回到各点最短距离min[]和路径pre[],pre[i]记录s到i路径上i的父结点,pre[s]=-1 //可更改路权类型,但必须非负! //可以把dj算法与prim算法对比记忆,要理解pre数组、min数组、V标记数组的含义! #include <iostream> #define MAXN 200 #define inf 1000000000 typedef int elem_t; using namespace std; int N,M,ss,ee,ww,s,mat[MAXN][MAXN],min[MAXN],pre[MAXN]; int i,j; //输出最短路径 void prn_pass(int k){ if (pre[pre[k]]!=-1) { cout<<"<--"<<pre[k]; prn_pass(pre[k]); } } void dijkstra(int n,elem_t mat[][MAXN],int s,elem_t* min,int* pre){ int v[MAXN],i,j,k; for (i=0;i<n;i++) min[i]=inf,v[i]=0,pre[i]=-1; for (min[s]=0,j=0;j<n;j++){ for (k=-1,i=0;i<n;i++) if (!v[i]&&(k==-1||min[i]<min[k])) k=i; for (v[k]=1,i=0;i<n;i++) if (!v[i]&&min[k]+mat[k][i]<min[i]) min[i]=min[k]+mat[pre[i]=k][i]; } } int main(){ cout<<"请输入顶点数量和边数"<<endl; cin>>N>>M; for (i = 0;i < N;i++) for (j = 0;j < N;j++) { if (i == j) mat[i][j] = 0; else mat[i][j] = inf; } cout<<"请输入各边起点终点和权值"<<endl; for (i = 0; i < M;i++) { cin>>ss>>ee>>ww; mat[ss][ee] = ww; } cout<<"请输入源点"<<endl; cin>>s; dijkstra(N,mat,s,min,pre); for (i = 0;i < N;i ++) { if (i != s) { cout<<s<<"到"<<i<<"的最短路径长度为:"<<min[i]<<endl; cout<<"路径为:"<<i; prn_pass(i); cout<<"<--"<<s<<endl; } } return 0; }
从网上看到某大牛用Floyd算法的思想也得以解决
#include <iostream> using namespace std; int A[101][101]; //Floyd算法思想 int main(){ int a,b; int N,i,j,k,x; scanf("%d%d%d",&N,&a,&b); for(i = 0;i <= N;i++) for (j = 0;j <= N;j++) { A[i][j] = 100; } for (i = 1;i <= N;i++) { cin>>k; for (j = 0;j < k; j ++)//与第i的站相连接的有k个站,赋值为1 { cin>>x; if ( j == 0 ) A[i][x] = 0; else A[i][x] = 1; } } for (k = 1;k <= N;k++) for(i = 1;i <= N;i++) for (j = 1;j <= N;j++) { if (A[i][j]>A[i][k] + A[k][j]) { A[i][j] = A[i][k] + A[k][j]; } } if (A[a][b] < A[0][0]) cout<<A[a][b]<<endl; else cout<<"-1"<<endl; return 0; }
相关文章推荐
- POJ 1847 最短路问题 dijkstra算法的实现
- 【解题报告】 POJ 1556 The Doors -- 最短路问题 Dijkstra算法 + 直线相交
- POJ 3268 Silver Cow Party(Dijkstra算法求解来回最短路问题)
- POJ1251—最小生成树问题的Prim实现
- 最短路径问题——Dijkstra算法(C++实现)
- POJ 1062 昂贵的聘礼【经典的最短路问题】
- poj 3254约瑟夫问题(队列实现)
- 算法java实现--贪心算法--单源最短路径问题--Dijkstra算法
- POJ 1274The Perfect Stall (二分图最大匹配问题,匈牙利算法实现)
- POJ 1062 昂贵的聘礼【经典的最短路问题】
- POJ中最短路问题汇总【转】
- 总结分析一下三种求解最短路问题的算法,dijkstra算法,spfa算法,floyd算法。
- poj 2387 Til the Cows Come Home (最短路问题 注意判重)
- 题解 最短路问题 POJ 2387
- (解题报告)POJ3664---Election Time---用结构体实现两组相关联数据的排序问题
- [NWPU][2014][TRN][18]最短路问题 A - 模板 POJ 2387
- POJ 1847 最短路径 垃圾水题可是坑爹多case问题初始化的锅
- poj 2253 Frogger dijkstra算法实现
- HDU - 2680 - Choose the best route (经典最短路问题dijkstra算法!!)
- POJ 1847 Tram --set实现最短路SPFA