首页 > 代码库 > [NOIp2010提高组]关押罪犯
[NOIp2010提高组]关押罪犯
OJ题号:洛谷1525
思路:贪心。
先将所有的人按怨气值从大到小排一下,然后依次尝试将双方分入两个不同的监狱,如果失败(即已分入相同的监狱),则输出这个怨气值。
1 #include<cstdio> 2 #include<algorithm> 3 #include<functional> 4 struct Edge { 5 int u,v,w; 6 bool operator >(const Edge &x) const { 7 return this->w>x.w; 8 } 9 };10 const int N=20001;11 class UnionFindSet {12 private:13 int anc[N<<1];14 int Find(int x) {15 return (x==anc[x])?x:(anc[x]=Find(anc[x]));16 }17 public:18 UnionFindSet(const int n) {19 for(int i=1;i<=n<<1;i++) anc[i]=i;20 }21 bool isConnected(const int x,const int y) {22 return Find(x)==Find(y);23 }24 void Union(const int x,const int y) {25 anc[Find(x)]=Find(y);26 }27 };28 int main() {29 int n,m;30 scanf("%d%d",&n,&m);31 Edge e[m];32 for(int i=0;i<m;i++) {33 scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);34 }35 std::sort(&e[0],&e[m],std::greater<Edge>());36 UnionFindSet s(n);37 for(int i=0;i<m;i++) {38 if(s.isConnected(e[i].u,e[i].v)) {39 printf("%d\n",e[i].w);40 return 0;41 }42 s.Union(e[i].u,e[i].v+n);43 s.Union(e[i].v,e[i].u+n);44 }45 puts("0");46 return 0;47 }
[NOIp2010提高组]关押罪犯
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。