Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。 Input 本题目包含多组数据,请处理到文件结束。 Output 对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1. Sample Input
3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2 Sample Output
2 -1 |
第一种 迪杰斯特拉算法
#include<stdio.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int vis[50010];
int d[50010];
int cost[1010][1010];
int n,m,start,e,a,b,c;
int inf=0x3f3f3ff;//无穷大
void dijkstra() {
int v,i,j;
for(v=0; v<n; v++)
d[v]=inf; //d总是指向到起点的最短距离
d[start]=0; //初始化起点的距离为0
while(1)
{
v=-1;
for(i=0; i<n; i++) {
if(!vis[i]&&(v==-1||d[i]<d[v])) {
v=i;
}
}
if(v==-1)break; //v为-1代表所有数据都被放入集合内部 ,如果换成for循环,此步省略
vis[v]=1;
for(j=0; j<n; j++)
d[j]=min(d[j],d[v]+cost[v][j]); //不断更新最短距离,让该点到原点总是距离最短的
}
}
int main() {
int i,j;
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=0; i<n; i++)
for(j=0; j<n; j++)
cost[i][j]=inf; //把距离初始化为无穷大
memset(vis,0,sizeof(vis));
for(i=1; i<=m; i++) {
scanf("%d%d%d",&a,&b,&c);
cost[a][b]=cost[b][a]=(c>cost[a][b]?cost[a][b]:c);
} //可能两条路修的是一样的 ,但距离不一样,选择最小的(死在这了)
scanf("%d%d",&start,&e);
dijkstra();
if(d[e]==inf)
printf("-1\n");
else
printf("%d\n",d[e]);
}
return 0;
}
第二种 Floyd
#include<stdio.h>
int map[205][205];
const int MAX=0xfffffff;
int main() {
int N,M;
int a,b,x;
int s,t;
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:MAX;
}
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算法
for(int k=0; k<N; k++) //中转城市k
for(int i=0; i<N; i++) //起点城市
for(int j=0; j<N; j++) { //终点城市
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}printf("%d\n",map[s][t]==MAX ? -1:map[s][t] );
}
return 0;
}