记录编号 76424 评测结果 AAAAAAAAAA
题目名称 [NOIP 2010]关押罪犯 最终得分 100
用户昵称 Gravatarranto 是否通过 通过
代码语言 C++ 运行时间 0.130 s
提交时间 2013-10-30 19:19:34 内存使用 0.31 MiB
显示代码纯文本
#include <fstream>
#include <algorithm>

using namespace std;

ifstream in("prison1.in");
ofstream out("prison1.out");

struct node
{
	long anger;
	int a;
	int b;
};

inline bool operator<(node r,node h)
{
	return (r.anger<h.anger);
}

inline bool operator>(node r,node h)
{
	return (r.anger>h.anger);
}

int n,m;
node *s;
int *f,*e;//f[i] : friend, e[i] : enemy

inline int findrootf(int a)
{
	register int itemp(a);
	while(f[itemp]!=itemp)
	{
		itemp=f[itemp];
	}
	return itemp;
}

int main()
{
	in>>n>>m;
	s=new node [m];
	f=new int [n+1];
	e=new int [n+1];
	for(int i=0;i!=m;++i)
	{
		int a,b,l;
		in>>a>>b>>l;
		s[i].a=a;
		s[i].b=b;
		s[i].anger=l;
	}
	stable_sort(s,s+m,greater<node>());
	for(int i=1;i!=n+1;++i)
	{
		f[i]=i;
		e[i]=0;
	}
	int ret(0);
	for(int i=0;i!=m;++i)
	{
		register int ai=s[i].a;
		register int bi=s[i].b;
		if(findrootf(ai)!=findrootf(bi))
		{
			if(e[ai]==0&&e[bi]==0)
			{
				e[ai]=bi;
				e[bi]=ai;
				continue;
			}
			if(e[ai]==0)
			{
				f[ai]=findrootf(e[bi]);
				e[ai]=findrootf(bi);
				continue;
			}
			if(e[bi]==0)
			{
				f[bi]=findrootf(e[ai]);
				e[bi]=findrootf(ai);
				continue;
			}
			f[findrootf(ai)]=findrootf(e[bi]);//把自己朋友的根节点连到对方的敌人的根节点上
			f[ai]=findrootf(e[bi]);//把自己连到对方敌人的根节点上
			f[findrootf(e[ai])]=findrootf(bi);//把自己敌人的朋友的根节点连到对方的朋友的根节点上
			continue;
		}
		ret=s[i].anger;
		break;
	}
	out<<ret<<endl;
	return 0;
}