您的位置:首页 > 其它

[NOIp2010提高组]关押罪犯

2017-06-11 18:43 204 查看

OJ题号:洛谷1525

思路:贪心。

先将所有的人按怨气值从大到小排一下,然后依次尝试将双方分入两个不同的监狱,如果失败(即已分入相同的监狱),则输出这个怨气值。

#include<cstdio>
#include<algorithm>
#include<functional>
struct Edge {
int u,v,w;
bool operator >(const Edge &x) const {
return this->w>x.w;
}
};
const int N=20001;
class UnionFindSet {
private:
int anc[N<<1];
int Find(int x) {
return (x==anc[x])?x:(anc[x]=Find(anc[x]));
}
public:
UnionFindSet(const int n) {
for(int i=1;i<=n<<1;i++) anc[i]=i;
}
bool isConnected(const int x,const int y) {
return Find(x)==Find(y);
}
void Union(const int x,const int y) {
anc[Find(x)]=Find(y);
}
};
int main() {
int n,m;
scanf("%d%d",&n,&m);
Edge e[m];
for(int i=0;i<m;i++) {
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
}
std::sort(&e[0],&e[m],std::greater<Edge>());
UnionFindSet s(n);
for(int i=0;i<m;i++) {
if(s.isConnected(e[i].u,e[i].v)) {
printf("%d\n",e[i].w);
return 0;
}
s.Union(e[i].u,e[i].v+n);
s.Union(e[i].v,e[i].u+n);
}
puts("0");
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: