HUD 2544 最短路
2016-05-18 18:28
387 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
题目大意: 求从商场到赛场的最短时间。
思路:即求最短路径问题。
分别用三种解决最短路径代码如下:
方法一:Dijkstar求最短路径
方法二:用floyd求最短路径
方法三:用spfa求最短路径
题目大意: 求从商场到赛场的最短时间。
思路:即求最短路径问题。
分别用三种解决最短路径代码如下:
方法一:Dijkstar求最短路径
#include<stdio.h> #include<string.h> #include<algorithm> #include<queue> #include<iostream> #include<math.h> using namespace std; const int INF=0x3f3f3f3f; int n,m; const int MAXN=310; int map[MAXN][MAXN],vis[MAXN],low[MAXN]; int Dijkstar() { int pos,i,j,min; memset(vis,0,sizeof(vis)); pos=1; vis[1]=1; for(i=1; i<=n; i++) { if(i!=pos) { low[i]= map[pos][i]; } } low[1]=0; for(i=1; i<=n; i++) { min=INF; for(j=1; j<=n; j++) { if(vis[j]==0&&min>low[j]) { min=low[j]; pos=j; } } if(min==INF) { break; } vis[pos]=1; for(j=1; j<=n; j++) { if(vis[j]==0&&low[j]>low[pos]+map[pos][j]) { low[j]=low[pos]+map[pos][j]; } } } return low ; } int main() { while(~scanf("%d%d",&n,&m)&&(n+m)) { int a,b,c; //memset(map,INF,sizeof(map)); for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { map[i][j]=INF; } } for(int i=1; i<=m; i++) { cin>>a>>b>>c; if(c<map[a][b]) { map[a][b]=map[b][a]=c; } } int answer=Dijkstar(); printf("%d\n",answer); } return 0; }
方法二:用floyd求最短路径
#include<stdio.h> #include<string.h> #include<algorithm> #include<queue> #include<iostream> #include<math.h> using namespace std; const int maxn=205; const int inf=0x3f3f3f3f; int map[maxn][maxn]; void floyd(int n) { int i,j,k; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { for(k=1;k<=n;k++) { map[j][k]=min(map[j][k],map[j][i]+map[i][k]); } } } } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) { break; } int a,b,c; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { if(i==j) { map[i][j]==0; } else { map[i][j]=map[j][i]=inf; } } } for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); map[a][b]=map[b][a]=c; } floyd(n); printf("%d\n",map[1] ); } return 0; }
方法三:用spfa求最短路径
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<climits> #include<queue> #include<algorithm> using namespace std; #define N 110 #define MAX INT_MAX >> 1 #define CLR(arr, what) memset(arr, what, sizeof(arr)) int nodenum, edgenum; int map , dis ; bool vis ; int i,j; int n,m; int spfa(int start,int endd) { queue<int>q; memset(vis,0,sizeof(vis)); for(i=1; i<=n; i++) { dis[i]=MAX; } dis[start]=0; vis[start]=1; q.push(start); while(!q.empty()) { int cur=q.front(); q.pop(); vis[cur]=0; for(i=1; i<=n; i++) { if(dis[i]>dis[cur]+map[cur][i]) { dis[i]=dis[cur]+map[cur][i]; if(vis[i]==0) { q.push(i); vis[i]=1; } } } } return dis[endd]; } int main() { int start,end,cost; int answer; while(~scanf("%d%d",&n,&m)&&(n+m)) { for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { map[i][j]=MAX; } } for(i=1; i<=m; i++) { cin>>start>>end>>cost; if(cost<map[start][end]) { map[start][end]=map[end][start]=cost; } } answer=spfa(1,n); printf("%d\n",answer); } }
相关文章推荐
- NanUI for Winform发布,让Winform界面设计拥有无限可能
- View坐标分析汇总
- Android自定义AsyncTaskLoader的使用
- 布局控件与地图控件关联
- 网络编程
- 64. Minimum Path Sum
- 是谁占用了我们的带宽:流量实时监控
- 如何在excel每一行数据后面都加一个逗号
- 堆和堆排序
- childNodes和Children的区别
- js添加触摸时间,禁止页面缩放
- 前端自动化之--gulp
- 如何在Chrome下使用Postman进行rest请求的调试
- 分布式配置服务etcd VS 分布式协调服务zookeeper
- MySql 插入数据
- 用户标签系统 数据库设计
- [KD-TREE] BZOJ 4066 简单题
- hdu1054Strategic Game&&hdu1150Machine Schedule(最小顶点覆盖)
- 安卓热更新之Nuwa实现步骤
- php AES 加密类