本文主要是介绍HDU1874畅通工程续 dijkstrafloyd,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
畅通工程续
http://acm.hdu.edu.cn/showproblem.php?pid=1874
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15713 Accepted Submission(s): 5371
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define inf 0x3f3f3f3f
int n,m,a,b,x,s,t;
int map[205][205];//邻接矩阵存图;
bool vis[205];//标记是否被访问过
int dis[205];//存每个点距源点的距离
void dijkstra(int s)
{for(int i=0;i<n;i++){dis[i]=map[s][i];vis[i]=false;}dis[s]=0;vis[s]=true;int pos,min;for(int i=1;i<n;i++){min=inf;for(int j=0;j<n;j++){if(!vis[j]&&dis[j]<min){min=dis[j];pos=j;}}vis[pos]=true;for(int j=0;j<n;j++){if(!vis[j]&&dis[j]>dis[pos]+map[pos][j])dis[j]=dis[pos]+map[pos][j];}}
}
int main()
{while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;i++)for(int j=0;j<n;j++){map[i][j]=map[j][i]=inf;}for(int i=0;i<m;i++){scanf("%d%d%d",&a,&b,&x);if(map[a][b]>x) //如果有重边!!!!map[a][b]=map[b][a]=x;}scanf("%d%d",&s,&t);dijkstra(s);if(dis[t]==inf)printf("-1\n");elseprintf("%d\n",dis[t]);}return 0;
}
floyd:
#include<stdio.h>
#include<iostream>
using namespace std;
#define inf 0x3f3f3f3f
int n,m,a,b,x,s,t;
int map[205][205];
void floyd()
{for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(map[i][k]+map[k][j]<map[i][j])map[i][j]=map[i][k]+map[k][j];}
}
int main()
{while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;i++)for(int j=0;j<n;j++)map[i][j]=(i==j?0:inf);for(int i=0;i<m;i++){scanf("%d%d%d",&a,&b,&x);if(map[a][b]>x)map[a][b]=map[b][a]=x;}scanf("%d%d",&s,&t);floyd();if(map[s][t]==inf)printf("-1\n");else printf("%d\n",map[s][t]);}return 0;
}
这篇关于HDU1874畅通工程续 dijkstrafloyd的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!