题目:http://www.gdfzoj.com/oj/contest/276/problems/1
bilibili拜年祭上,小妹妹被邪♂恶的组织带♂走的事情,引发了22和33的关注。她们现在关心着平静之下暗流涌动的小电视们。
在邪♂恶组织地盘上传播小电视会有一定的风险,现在22和33希望能在邪♂恶组织地盘上尽可能安全地传播小电视,来保护 ' knows nothing about *♂* ' 的孩子们。
22和33希望知道在小电视能传播到任何一个地区的基础上,并且尽可能安全的情况下,传播小电视最危险的道路的危险值是多少。如果不是太危险,22和33就去旅游了~
Input
第一行有 n , m 两个正整数 ( 1<n<=100000 , m<=200000 ) 表示邪♂恶组织地盘数和道路数
接下来的 m 行,每行有3个正整数 a , b , c ( a , b<=n )
a,b 表示道路所连通的地区,c 表示该道路危险值,越大代表越危险
由于邪♂恶组织道路比较邪♂恶,所以只能保证道路可以使任意两城市互达(道路是无向的)
Output
输出一个正整数,表示在小电视能传播到任何一个地区的基础上,并且尽可能安全的情况下,传播小电视最危险的道路的危险值是多少
Sample Input
2 1
1 2 233
Sample Output
233
又一个坑爹样例。。。
题目求的是最大边权的最小值,不是和!!!
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
int u,v,w;
};
const int maxS=200000;
node edge[maxS+5];
int n,m,ans=0;
int a[maxS+5];
bool cmp(node x,node y)
{
return x.w<y.w;
}
int find(int x)
{
int x1,fu;
if (a[x]==x)
return x;
else
fu=x;
while (fu!=a[fu])
fu=a[fu];
while (fu!=x)
{
x1=a[x];
a[x]=fu;
x=x1;
}
return fu;
}
void kruskal()
{
int i=1,tot=1,x,y,fx,fy;
while (tot<n)
{
x=edge[i].u; y=edge[i].v;
fx=find(x); fy=find(y);
if (fx!=fy)
{
a[fx]=fy;
tot++;
}
i++;
}
printf("%d\n",edge[i-1].w);
}
int main()
{
int i;
freopen("a.txt","r",stdin);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
a[i]=i;
for (i=1;i<=m;i++)
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
sort(edge+1,edge+m+1,cmp);
kruskal();
return 0;
}