P1525 关押罪犯

时间:2024-01-13 13:15:38

基础并查集--

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int maxx = ;
int n,m;
int pre[maxx];
int f[maxx];
void init()
{
for (int i=; i<=maxx; i++)
{
pre[i]=i;
}
}
int findd(int x)
{
int r=x;
while(pre[r]!=r)
r=pre[r];//找到他的前导结点
int i=x,j;
while(i!=r)//路径压缩算法
{
j=pre[i];//记录x的前导结点
pre[i]=r;//将i的前导结点设置为r根节点
i=j;
}
return r;
}
void join(int x,int y)
{
int fx=findd(x);
int fy=findd(y);
if (fx!=fy)
pre[fx]=fy;
}
struct node
{
int u,v,w;
} a[maxx];
bool cmp(node aa,node bb)
{
return aa.w>bb.w;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
memset(f,,sizeof(f));
int flag=;
for (int i=; i<=m; i++)
{
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
}
sort(a+,a++m,cmp);
for (int i=; i<=m; i++)
{
int fax=findd(a[i].u);//
int fay=findd(a[i].v);
if (fax==fay)//首先判断是不是一个集合,如果是就立马输出
{
flag=a[i].w;
break;
}
if (!f[a[i].u])//如果这个点没有敌人
{
f[a[i].u]=a[i].v;//加一个敌人
}
else
{
join(f[a[i].u],a[i].v);//如果这个点有敌人把敌人变为自己人
}
if (!f[a[i].v])
{
f[a[i].v]=a[i].u;
}
else
{
join(f[a[i].v],a[i].u);
} }
printf("%d\n",flag);
}
return ;
}