题目:http://poj.org/problem?id=1797
题意:N个城市,M条路,求从城市1到每个城市之间都选路最宽的情况下,最窄的方案是多少,相当于把最短路径问题换成了最“宽”路径,城市之间的距离换成了城市之间道路的宽度
这里的dijkstra
for(1到N)
for(1到N)
求出离远点之间路最宽的城市是哪一个
选出这个和远点并到集合vis中,表示这个城市已经选定过了,是最短情况
for(1到N)
从1到N更新每个点到原点的最宽路的情况,也就是进行判断(path[j] 中的数更大 还是mins(path[point],maps[point][j]) 更大)再重新覆盖path[j]
所有循环进行完后,path[n]肯定是最窄的,因为大循环中第一个小循环是从宽到窄进行的循环,找到点归到集合中的
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 1003
#define maxn (1<<30)
#define mins(a,b) (a<b?a:b)
int maps[N][N],vis[N],path[N],n,m;
int dijkstra(){
int i,j,point;
vis[1]=1;
for(i=1;i<=n;i++){
path[i] = maps[1][i];
}
for(i=1;i<=n;i++){
int tmp = -1;
for(j=1;j<=n;j++){
if(path[j]>tmp&&!vis[j]){
tmp = path[j];
point =j;
}
}
vis[point]=1;
for(j=1;j<=n;j++){
if(!vis[j]&&mins(path[point],maps[point][j])>path[j])
path[j]=mins(path[point],maps[point][j]);
}
}
return path[n];
}
int main(){
int cases,i,j,a,b,c;
scanf("%d",&cases);
for(int t=1;t<=cases;t++){
memset(maps,0,sizeof(maps));
memset(vis,0,sizeof(vis));
memset(path,0,sizeof(path));
cin>>n>>m;
for(i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
maps[a][b]=maps[b][a]=c;
}
printf("Scenario #%d:\n",t);
printf("%d\n\n",dijkstra());
}
return 0;
}