uva 1160 - X-Plosives

/*
题意:往仓库里放炸药,把关键引爆炸药的数对拿出并计数
数学模型:输入数对,判断是否成环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;
}//*/

posted on 2013-02-19 13:01  ACM_Someone like you  阅读(409)  评论(0编辑  收藏  举报

导航