先大致解释一下题意, 求得是从街道1出发,到街道n,可以运输的最大重量。
该题用的是Dijkstra算法。大致思路如下:
int Graph[1001][1001]; //街道i到街道j的重量
int flag[1001]; //标记是否访问过
int Dis[1001]; //点1到每个点的最大重量
1.定义了三个数组
2.求得距离街道1最大重量的那个街道。此时是街道3,Dis[3] 为4
3.在最大值的基础上,判断是否需要更新Dis[ ] 的值。eg: Dis[2](值为3) 是和 Dis[3] 和 Graph[3][2] 的最小距离 (Min(4,5))进行比较 。所以Dis[2]更新为4.
下面查看全部源码:
#include <stdio.h>
#include <stdlib.h>
int n,m,scenario;
int Graph[1001][1001]; //街道i到街道j的最大重量
int flag[1001]; //标记是否访问过
int Dis[1001]; //点1到每个点的最大重量
int Min(int a, int b){
if(a<b){
return a;
}else{
return b;
}
}
void Dijkstra(){
int i, j;
flag[1]=1;
for(i=1;i<=n;i++){
Dis[i]=Graph[1][i];
}
for(i=1;i<n;i++){ //每次求一个与街道1重量最大的顶点,求n-1次
int max = 0;
int index =0;
for(j=1;j<=n;j++){ //寻找距离顶点1的最大重量
if(flag[j]==0 && max < Dis[j]){
max = Dis[j];
index = j;
}
}
flag[index]=1;
for(j=1;j<=n;j++){ //更新最大重量
if(flag[j]==0 && Graph[index][j]!= 0 && Dis[j] < Min(max,Graph[index][j])){ // 区别: 1到2的重量,取决于1到3 和 3到2的最小值,
Dis[j] = Min(max,Graph[index][j]);
}
}
}
}
int main()
{
int i;
int num=1;
freopen("input.txt","r",stdin);
scanf("%d",&scenario);
while(scenario--){
memset(Graph,0,sizeof(Graph));
memset(flag,0,sizeof(flag));
memset(Dis,0,sizeof(Dis));
scanf("%d%d",&n,&m); //n个顶点,m条边
int x,y,d;
for(i=0;i<m;i++){
scanf("%d%d%d",&x,&y,&d);
Graph[x][y] = d;
Graph[y][x] = d;
}
Dijkstra();
printf("Scenario #%d:\n",num++);
printf("%d\n\n",Dis[n]);
}
return 0;
}
最后,总结一下Floyed和Disjkstr算法之间的区别:
Floyed: 多源最短路径,计算的是各个点之间的最短路径。
Disjkstr: 单源最短路径,计算的是一个源点到各个点的最短路径。