语言:C++14(GCC 9) -O2
情况:能过样例,#1 AC,#2~9 全WA,无其他情况
//并查集(按秩合并+路径压缩)
#include <bits/stdc++.h>
using namespace std;
const int N=100010;
struct Node{
int x,y,c;
bool operator < (const Node& rhs) const {
return c>=rhs.c;
}
}e[N];
int n,m,p[N],pd[N],Rank[N];
inline void make_set(int x)//初始化
{
p[x]=x;
Rank[x]=1;
}
int find(int x)//查找
{
if(x!=p[x])p[x]=find(p[x]);
return p[x];
}
int union_set(int x,int y)//合并
{
x=find(x),y=find(y);
if(x!=y)
{
if(Rank[x]<Rank[y])swap(x,y);
p[y]=x;
if(Rank[x]==Rank[y])Rank[x]++;
}
return x;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>e[i].x>>e[i].y>>e[i].c;
sort(e+1,e+n+1);//贪心,排序
for(int i=1;i<=n;i++)make_set(i);
for(int i=1;i<=m;i++)
{
int x=e[i].x,y=e[i].y;
if(find(x)==find(y))//已经同一监狱,无法分开
{
cout<<e[i].c<<endl;
return 0;
}
if(!pd[x])pd[x]=y;//创建敌人关系
else p[find(pd[x])]=find(y);//已有敌人
if(!pd[y])pd[y]=x;//创建敌人关系
else p[find(pd[y])]=find(x);//已有敌人
}
cout<<0<<endl;
return 0;
}
不知道为什么错了……