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.\n";
                   else
                       cout<<"Case "<<cas<<" is not a tree.\n";
                   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;
}

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

POJ1308,布布扣,bubuko.com

时间: 2024-07-30 13:48:57

POJ1308的相关文章

poj1308 Is It A Tree?(并查集)详解

poj1308   http://poj.org/problem?id=1308 题目大意:输入若干组测试数据,输入 (-1 -1) 时输入结束.每组测试数据以输入(0 0)为结束标志.然后根据所给的所有(父亲, 孩子)数据对判断 是否能构成一棵树. 分析: 都以了解树只有一个根节点,那么我们就判断是不是有多个树:又知道每个节点只有一个父亲节点,那么我们就判断他是不是构成环,成环则不是树. 注意: ①可以是空树: ②所给的节点构成森林(多个树)是不可以的,必须只能构成一棵树. #include<

HDU1325 &amp;&amp;poj1308 基础并查集

和上一道小希的迷宫差不多,但是在HDU上提交一直WA,POJ过了 HDU的数据太强了吧,强的我感觉数据有问题 题意:输入若干对点,判断是否是一颗树,转化过来也就是是否存在环 点数-边数=1,还要判断每个点的入度都<=1 POJ AC代码 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> const

poj1308 并查集

题意:和hdu1272差不多,只不过给出的是有向图,问图中的点是否是一颗树. 还是用并查集合并点,对于一条边,如果连接的两点已经在同一并查集内,则可以直接判否.合并时按边的方向记录点的入度,如果某个点入度大于1也就是某个点有多个父亲节点,则说明不是树.合并时顺便记录合并总次数,最后合并 点数-1 次则是树. 1 #include<stdio.h> 2 #include<string.h> 3 4 int fa[100005],num[100005]; 5 bool vi[10000

hdu-1325 &amp; poj-1308 Is It A Tree?

http://acm.hdu.edu.cn/showproblem.php?pid=1325 题意: 判断一个图是不是说树 只有树的根入度为 0 ,其余结点入度均为 1; Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15503    Accepted Submission(s): 3443 Problem

POJ1308——Is It A Tree?

Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22631   Accepted: 7756 Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edge

POJ1308 Is It A Tree?

题目大意:和HDU1272-小希的迷宫题目一样, 如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路).小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路.比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8.  Input 输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号.房间的编号至少为1,

并查集 poj1308

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <vector> 5 6 using namespace std; 7 8 vector<int> used; 9 int father[101000]; 10 11 int main() 12 { 13 int time=1; 14 while(true) 15 { 16 for(int i=0;i

hdu1325is it a tree?&amp;&amp;poj1308 is it a tree?(并查集)

题目链接: huangjing||huangjing 建议做hdu上的这个题,因为poj上面的数据很弱,就是因为只做了poj上面的导致我在一次比赛中一直wa到比赛结束,因为比赛的那次挂的是hdu上的题... 题意: 判断由给出的数据得到的是否是一棵树... 思路: 这个题有几个要注意的地方. [1]首先一棵树只能有一个入度为0的点即根节点..所以根节点唯一.. [2]除根节点外其他点的入度均为1. 题目: Language: Default Is It A Tree? Time Limit: 1

Is It A Tree?----poj1308

http://poj.org/problem?id=1308 #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> #define N 110 #define INF 0xfffffff using namespace std; int f[N],vis[N]; int Find(int x) { if(x!=f[x