题目链接:kuangbin带你飞 专题四 最短路练习 C - Heavy Transportation
题意
有n个城市,n个城市之间有m条公路或桥梁,每个公路或桥都有一个最大载重量,问从城市1到城市n所能运送到货物到最大重量是多少
思路
显然1到n的最大承重量为所有公路的承重量的最小值
那么本题就是要求1到n的所有可能路径中最大承重量最大的一条路,即所经过所有公路的载重量最小值 最大的一条路。
对dijkstra进行修改,令d[i]表示1到i的所有可能路径中载重量最小值最大的一条路的最小值,最终的解就是d[n];
代码
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1009;
const int MAX = 0x3f3f3f3f;
int v[N][N];
bool vis[N];
int d[N];
int dijkstra(int n)
{
memset(vis, 0, sizeof(vis));
for(int i=1; i<=n; i++)
d[i] = v[1][i];
vis[1] = 1;
for(int i=1; i<n; i++)
{
int x = -1, max = 0;
for(int j=1; j<=n; j++)
{
if(!vis[j] && d[j] > max)
max = d[x = j];
}
if(x == -1)
break;
vis[x] = 1;
for(int j=1; j<=n; j++)
{
if(!vis[j])
{
int mmin = min(max, v[j][x]);
if(mmin > d[j])
{
d[j] = mmin;
}
}
}
}
return d[n];
}
int main()
{
int T;
cin>>T;
for(int C=1; C<=T; C++)
{
int n, m;
cin>>n>>m;
memset(v, 0, sizeof(v));
for(int i=0; i<m; i++)
{
int a, b, c;
scanf("%d%d%d",&a,&b,&c);
v[a][b] = v[b][a] = c;
}
cout<<"Scenario #"<<C;
cout<<":"<<endl;
cout<<dijkstra(n)<<endl<<endl;
}
return 0;
}