/////////////////////////////////////////
//作品名称:并查集应用
//作者姓名:梁岳传
//作品时间:2008-8-15
//最后修改:2008-8-15
//Q Q 号码:280282813
//版权所有,翻版必究
/////////////////////////////////////////
#include<iostream>
using namespace std;
#define MAX 1000010
int ary[MAX];
int opt[MAX];
void Init(int n)
{
int i;
for(i = 0; i <= n+10; ++i)
{
ary[i] = -1;
opt[i] = -1;
}
}
int Find(int index)
{
if(ary[index] < 0)
return index;
return ary[index] = Find(ary[index]);
}
int Union(int first, int second)
{
int i, j;
if(second == -1)
return first;
i = Find(first);
j = Find(second);
if(i == j)
return i;
if(ary[i] < ary[j])
{
ary[i] += ary[j];
ary[j] = i;
return i;
}
else
{
ary[j] += ary[i];
ary[i] = j;
return j;
}
return -1;
}
void UnionDiff(int first, int second)
{
int r1, r2, d1, d2;
r1 = Find(first);
r2 = Find(second);
if(r1 == r2)
return;
d1 = Union(r1, opt[r2]);
d2 = Union(r2, opt[r1]);
opt[d1] = d2;
opt[d2] = d1;
}
int main(int argv, char* argc[])
{
int vexs, edges, tests, ct;
int i, first, second;
bool flag;
cin>>tests;
ct = 1;
while(tests--)
{
scanf("%d%d", &vexs, &edges);
Init(vexs);
flag = false;
for(i = 0; i < edges; ++i)
{
cin>>first>>second;
if(Find(first) == Find(second))
flag = true;
else
UnionDiff(first, second);
}
cout<<"Scenario #"<<ct<<":"<<endl;
if(flag == true)
cout<<"Suspicious bugs found!"<<endl<<endl;
else
cout<<"No suspicious bugs found!"<<endl<<endl;
ct++;
}
return 0;
}
正文
并查集的应用PKU24922008-08-21 13:11:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/lqf110/37757.html
阅读(2222) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论