N个点,M条边,每条边有权值。求一条1号点到N号点的路径,要求使得路径中的边权最小值最大。
Input
多组输入,第一行给一个T。
每一组第一行给两个数n和m。(1 <= n <= 1000)
接下来m行,每行三个数u,v,w代表路径的两个端点与边权。
(1 <= u,v <= n , 0< w <= 1e6)
保证两点间只有一条边,该图为无向图。
Output
第i组数据先输出 "Scenario #i:"
然后输出该路径上的最小边权。
保证有解
Sample Input
1
3 3
1 2 3
1 3 4
2 3 5
Sample Output
Scenario #1:
4
这道题目与 POJ 2253 差不多,很相像,就是与那道题目正好相反,这个是求最大的 最小边(每条通路都有一个最小边),具体的就不对说了,就很像最大生成树,就是全反过来。
代码:
#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
#include<string.h>
typedef long long ll;
using namespace std;
const int maxn=1010;
const int inf = 0x3f3f3f3f;
int maap[maxn][maxn];
int vis[maxn];
int d[maxn];
int n,m;
void init()
{
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j)
maap[i][j]=0;
else
maap[i][j]=-inf;
}
int main()
{
int t;
scanf("%d",&t);
int kase=0;
while(t--)
{
scanf("%d%d",&n,&m);
init();
int a,b,val;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&val);
if(maap[a][b]<val)
{
maap[a][b]=maap[b][a]=val;
}
}
for(int i=1;i<=n;i++)
d[i]=maap[1][i];
int pos;
for(int i=0;i<=n;i++)
{
int minv=-inf;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&d[j]>minv)
{
pos=j;
minv=d[j];
}
}
vis[pos]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j])
d[j]=max(d[j],min(d[pos],maap[pos][j]));
}
}
printf("Scenario #%d:\n%d\n\n",++kase,d[n]);
}
return 0;
}
很好,这两个题目,多学习了。