基础并查集--

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int maxx = 200005;
int n,m;
int pre[maxx];
int f[maxx];
void init()
{
    for (int i=0; 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,0,sizeof(f));
        int flag=0;
        for (int i=1; i<=m; i++)
        {
            scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
        }
        sort(a+1,a+1+m,cmp);
        for (int i=1; 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 0;
}