Time Limit:3s Memory Limit:128MByte
Submissions:573Solved:105
DESCRIPTION
这个地区可以看作是一个无向图,N个点M条边组成。每个边有一个边权。我们定义一条路径的花费,就是这条路径上最大的边权。
现在有一条咸鱼,想从S走到T,徒步旅行。
咸鱼于是找到了你,想让你告诉他从S到T的最小花费。
INPUT
第一行两个整数,N,M。满足(1 <= N <= 10^5, 0 <= M <= 5*10^5)接下来M行,每行三个整数U,V,C。表示有一个连接U点和V点的边,且边权是C。(1<=C<=10^9)接下来一个行是两个整数S,T(1<=S,T<=n)
OUTPUT
输出答案,如果S不能到达T,输出-1
SAMPLE INPUT
5 51 2 12 3 13 4 14 5 15 1 11 3
SAMPLE OUTPUT
1
SOLUTION
因为kruskal原理是从小向大依次取边,那么用kruskal跑到 st 和 ed 恰好联通时的边即为最大边。
跑一边k'ruskal.满足题意则跳出。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1000000007;
const int maxn=1e5+10;
const int maxm=5e5+10;
int n,m,cnt=0;
int fa[maxn];
struct node{
int u,v,w;
}edge[maxm*2];
bool cmp(node a,node b){
return a.w<b.w;
}
int Find(int x){
if(fa[x]==x) return x;
else return fa[x]=Find(fa[x]);
}
void addedge(int u,int v,int w){
edge[++cnt].v=v;
edge[cnt].w=w;
edge[cnt].u=u;
}
int kruskal(int st,int ed){
for(int i=1;i<=n;++i) fa[i]=i;
sort(edge+1,edge+cnt+1,cmp);
int tot=0,ans=0;
for(int i=1;i<=cnt;i++){
int u=edge[i].u;
int v=edge[i].v;
int w=edge[i].w;
int t1=Find(u);
int t2=Find(v);
if(t1!=t2){
ans=w;
fa[t1]=t2;
tot++;
}
if(Find(st)==Find(ed)) return ans;
}
return -1;
}
int main(){
int a,b,c,st,ed;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;++i){
scanf("%d %d %d",&a,&b,&c);
addedge(a,b,c);
addedge(b,a,c);
}
scanf("%d %d",&st,&ed);
printf("%d\n",kruskal(st,ed));
return 0;
}