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<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 250
int dis[N];
int S[N],n,m;
int inf=0x3f3f3f3f;
int edge[N][N];void init(){//初始时将点看成孤点 距离为无穷
memset(S,0,sizeof(S));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
edge[i][j]=inf;
}
}
}void Djs(int x){//x为起点
for(int i=0;i<n;i++){
dis[i]=edge[x][i];
}
dis[x]=0;
for(int i=0;i<n;i++){//找没遍历的点
int index,mindis=inf;
for(int j=0;j<n;j++){
if(S[j]==0&&dis[j]<mindis){
mindis=dis[j];
index=j;
}
}
S[index]=1;
for(int j=0;j<n;j++){//将点更新
if(dis[index]+edge[index][j]<dis[j])
dis[j]=dis[index]+edge[index][j];
}
}
}int main(){
while(scanf("%d %d",&n,&m)!=EOF){
init();
for(int i=0;i<m;i++){//输入两点间的距离
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(edge[a][b]>c)
edge[a][b]=edge[b][a]=c;//防重 更新到最小
}
int x,y;
scanf("%d%d",&x,&y);
Djs(x);
if(dis[y]==inf)
printf("-1\n");
else printf("%d\n",dis[y]);
}
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;
}