最短路变形或最大生成树变形。
问 目标两地之间能通过的小重量。
用最短路把初始赋为INF,其他为0.然后找 dis[v]=min(dis[u], d);
生成树就是把最大生成树找出来,直到出发和终点能沟通的时候,最小的边就是。
Kruskal:
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
#define LL long long
using namespace std;
int n,m;
int fa[201];
map<string,int>city;
struct lx
{
int u,v,len;
}l[19901];
int father(int x)
{
if(x!=fa[x])
return fa[x]=father(fa[x]);
}
bool cmp(lx a, lx b)
{
return a.len>b.len;
}
int main()
{
int nn=1;
while(scanf("%d%d",&n,&m),n||m)
{
for(int i=0;i<=n;i++)
fa[i]=i;
city.clear();
char a[31],b[31];
int len,u,v,cot=0;
for(int i=0;i<m;i++)
{
scanf("%s%s%d",a,b,&len);
u=city[a];
if(u==0)city[a]=cot++;
u=city[a];
v=city[b];
if(v==0)city[b]=cot++;
v=city[b];
l[i].u=u,l[i].v=v,l[i].len=len;
}
scanf("%s%s",a,b);
int x=city[a];
int y=city[b];
sort(l,l+m,cmp);
int ans=INF;
for(int i=0;i<m;i++)
{
u=father(l[i].u);
v=father(l[i].v);
if(u==v)continue;
fa[v]=u;
ans=min(ans,l[i].len);
if(father(x)==father(y))break;
}
printf("Scenario #%d\n%d tons\n\n",nn++,ans);
}
}