题目链接:http://poj.org/problem?id=2387
题目大意:求点1到点n的最短距离
1、Dijkstras算法
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define maxn 1010 #define INF 0x3f3f3f int map[maxn][maxn]; int vis[maxn]; //标记最短路的点 int dis[maxn]; //源点到其他的点最短的距离 void setmap(int m) { memset(map,INF,sizeof(map)); int a,b,c; for(int i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) //双向边处理 map[a][b]=map[b][a]=c; } } void dijkstra(int n,int s) { memset(dis,INF,sizeof(dis)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) dis[i]=map[s][i]; for(int i=1;i<=n;i++)//n次松弛 { int pos; int valu=INF; for(int j=1;j<=n;j++)//找到某一点的最短路径 if(!vis[j] && dis[j]<valu) { pos=j; valu=dis[j]; } vis[pos]=1;//标记找到最短路径的点 for(int j=1;j<=n;j++)//更新最短路径 { if(!vis[j] && dis[j]>dis[pos]+map[pos][j]) dis[j]=dis[pos]+map[pos][j]; } } } int main() { int n,m; while(scanf("%d%d",&m,&n)!=EOF) { setmap(m); dijkstra(n,1); printf("%d\n",dis[n]); } return 0; }
2、Bellman_ford算法
#include <iostream> #include <cstring> #include <cstdio> using namespace std; struct point//x->y的花费cou { int x,y,cou; }; #define maxn 1010 #define INF 0x3f3f3f point e[maxn*4];//记边 int dis[maxn];//源点到其它点的最短距离 void setmap(int m) { for(int i=0;i<m;i++) { cin>>e[i].x>>e[i].y>>e[i].cou; e[i+m].y=e[i].x; //双向处理 e[i+m].x=e[i].y; // e[i+m].cou=e[i].cou; // } } void bellman_ford(int n,int m,int s) { memset(dis,INF,sizeof(dis)); dis[s]=0; for(int i=1;i<n;i++) for(int j=0;j<2*m;j++) if(dis[e[j].y]>dis[e[j].x]+e[j].cou) dis[e[j].y]=dis[e[j].x]+e[j].cou; } int main() { int n,m; while(scanf("%d%d",&m,&n)!=EOF) { setmap(m); bellman_ford(n,m,1); cout<<dis[n]<<endl; } }
时间: 2024-11-06 13:30:43