【P1525】2~9 WA,算法并查集
查看原帖
【P1525】2~9 WA,算法并查集
481330
sunyizhe还是MC大佬楼主2022/12/5 17:01

语言: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;
}

不知道为什么错了……

2022/12/5 17:01
加载中...