zoukankan      html  css  js  c++  java
  • POJ1308

    1、题目链接地址

      http://poj.org/problem?id=1308

    2、源代码

    #include<iostream>
    using namespace std;
    #define MAXN 100
    int set[MAXN]; //set[]记录每个节点的父节点
    
    int FindSet(int x) //寻找x所在根的根节点
    {
         if(set[x]==x)
             return x;
         if(set[x]==-x)
             return -x;
         else
             set[x]=FindSet(set[x]);
         return set[x];
    }
    int main()
    {
         int pointa,pointb,FSa,FSb;
         int cas=1,num=0,I;
         bool judge=0,flag=0;//judge为是否判断完,flag为是否有边输入
         for(I=0;I<MAXN;I++)
             set[I]=-I;
         while(cin>>pointa>>pointb,pointa>=0)
         {
             if(pointa==0)
             {
                      if(num==1||flag==0)
                           cout<<"Case "<<cas<<" is a tree.
    ";
                       else
                           cout<<"Case "<<cas<<" is not a tree.
    ";
                       cas++;
                       flag=0;
                       num=0;
                       judge=0;
                       for(I=0;I<MAXN;I++)
                           set[I]=-I;
             }
             else
             {
                  flag=1; //有边
                  FSa=FindSet(pointa);
                  if(FSa==-pointa)
                       set[pointa]=pointa;
                  FSb=FindSet(pointb);
                  if(FSb==-pointb)
                       set[pointb]=pointb;
                  if(FSa==FSb)
                  {
                       num=0;
                       judge=1;
                  }   
                  if(judge==0)
                  {   
                       if(FSb==pointb) //pontb是已出现过的根节点
                       {
                           if(FSa!=-pointa) //当pointa不是还没有出现过的点
                           {
                                num--;
                           }
                           set[pointb]=FindSet(pointa);
                       }
                       else
                       {
                           if(FSb==-pointb) //pointb还没有出现过
                           {
                                if(FSa==-pointa) //pointa还没有出现过
                                {
                                     num++;
                                }
                                set[pointb]=FindSet(pointa);
                           }
                           else
                           {
                                num=0;
                                judge=1;
                           }
                       }
                  }
             }
         }
         return 0;
    }

      好久的东西,粗略整理一下。

    作者:BestNow
    出处:http://www.cnblogs.com/BestNow/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Task Schedule
    Number Game
    CDQ分治
    Friends and Subsequences
    HDU5266 pog loves szh III
    P1593 因子和
    求一个数的欧拉函数的优化
    Grandpa's Estate POJ
    LightOJ
    Paint The Wall HDU
  • 原文地址:https://www.cnblogs.com/tianxue/p/3916906.html
Copyright © 2011-2022 走看看