您的位置:首页 > 其它

uva 1160 - X-Plosives

2013-02-19 13:01 330 查看
/*
题意:往仓库里放炸药,把关键引爆炸药的数对拿出并计数
数学模型:输入数对,判断是否成环eg(1,2 2,3 3,4, 1,4)这个时候要计数。
该题中让人费解反复的的是n种材料是不是都出现才会引爆?不是
eg(1,2 2,4 1,4)也要累加计数。
核心算法:并查集、判环 前面的数和当前的这个数只要都是一个根节点时就判为环 否则归并
为一个集合一个根节点-1止。
输入时候注意:循环输入EOF,开始时用了while(1)超时了没有节制注意一下
Root :: AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu)
:: Chapter 3. Data Structures :: Fundamental Data Structures :: Examples
*/
//AC不容易
#include<stdio.h>
#include<string.h>
const int M=100010;//100000+10;
int ct;
int fa[M];
void inist()
{
int i;
for(i=0;i<M;i++)
fa[i+1]=i+1;
}
int find(int x)//查根节点
{
while(fa[x]!=x)
x=fa[x];
return x ;
//else return x;
}
void Union(int a,int b)//并查集
{
int i,j,k;
int f1,f2;
f1=find(a);
f2=find(b);
if(f1!=f2)
{
fa[f1]=fa[f2];
}
else ct++;
}
int main()
{
int a,b;
while(scanf("%d",&a)!=EOF)//此处必须EOF的方式处理
//不然就会判定为超时!!!
{
ct=0;
inist();//初始化所有根节点
while(a!=-1)
{
scanf("%d",&b);//if(a==-1)break;
Union(a,b);//并查集
scanf("%d",&a);
}
printf("%d\n",ct);
}
return 0;
}
/*
int main()
{
int a,b;
while(1)
{
ct=0;
inist();//初始化根节点
while(1)//超时!!!!
{

scanf("%d",&a);
if(a==-1)break;
scanf("%d",&b);
Union(a,b);
}
printf("%d\n",ct);

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