E -- 咸鱼旅行
Time Limit:3s Memory Limit:128MByte
Submissions:458Solved:77
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
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
const int maxm = 5*1e5+10;
int father[maxn];
int N,M,S,T;
struct Edge
{
int u;
int v;
ll w;
bool operator<(const Edge e1) const
{
return w<e1.w;
}
}edge[maxm];
void init_set()
{
for(int i = 1; i <= N; i++)
father[i] = i;
}
int find_set(int x)
{
int tmp = x;
while(x!=father[x])
{
x = father[x];
}
while(tmp != father[tmp])
{
int pre = father[tmp];
father[tmp] = x;
tmp = pre;
}
return x;
}
void union_set(int x,int y)
{
father[x] = y;
}
ll Kruskal()
{
init_set(); ///初始化并查集
for(int i = 0; i < M; i++)
{
int u = edge[i].u;
int v = edge[i].v;
int fu = find_set(u);
int fv = find_set(v);
if(fu != fv)
{
union_set(fu,fv);
int fs = find_set(S);
int ft = find_set(T);
if(fs == ft)
{
return edge[i].w;
}
}
}
return -1;
}
int main()
{
while(~scanf("%d%d",&N,&M))
{
for(int i = 0; i < M; i++)
{
scanf("%d%d%lld",&edge[i].u,&edge[i].v,&edge[i].w);
}
sort(edge,edge+M);
scanf("%d%d",&S,&T);
ll ans = Kruskal();
printf("%lld\n",ans);
}
return 0;
}