(╭ ̄3 ̄)╭ 小希的迷宫II

(╭ ̄3 ̄)╭ 小希的迷宫II

TimeLimit: 2000/1000 MS (Java/Others)  MenoryLimit: 65536/32768 K (Java/Others)

64-bit integer IO format:%I64d

Problem Description

上次Gardon的迷宫城堡小希玩了很久,现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是单向连通的,就是说如果有一个通道连通了房间A和B,那么它只能从房间A走到房间B,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路),并且必须要是树形结构,只能有一个根节点(没有任何一点指向它!!!)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却不符合所要求的树形结构。

  

对于每一幅地图,都需要满足上述所要求的树形结构,这样的设计图才算合格。当只输入0 0,判断为树

Input

输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。 整个文件以两个负数结尾。

Output

对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Case k is a tree.",否则输出"Case k is not a tree."。k表示的是第i组案例。(当作从第1组开始)

SampleInput

6 8 5 3 5 2 6 4
5 6 0 0
8 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 0
3 8 6 8 6 4
5 3 5 6 5 2 0 0
-1 -1

SampleOutput

Case 1 is a tree.
Case 2 is a tree.
Case 3 is not a tree.

解法一:(只是在小希的迷宫上添加了入度条件即可)

和小希的迷宫,基本一样,只是构成的图变成是有向图了的,还需要判断该有向图是否能够构成树


  输入a,b,表示点a指向点b,直到输入0 0开始判断,所输入所有点能否构成有向连通图无回路且是


1,根据图论的知识很容易可以知道,所有点(比如有N个点M条不重复的边)要构成有向连通图,只判断M=N-1即可。


2,用并查集的知识,判断是否存在回路,只需判断两个点的祖先是否一样即可。


3,需要多注意的一点是,还需要判断该有向连通图能够构成树,并不是所以得有向连通图都算是树。


  题目要求的树的结构是  :以箭头的方向为子节点,所以需要判断的是入度。


  比如输入a b,表示a指向b,既为a是b的父亲节点,b是a的孩子节点,只要统计b的入度状态即可。


而且,树的定义有且仅有一个根节点树的根节点的入度为0,其余的节点入度均为1


  比如输入:1 2 3 2 0 0,表示的图是有向图,但他不具备题目所要求的树的结构


  所以,能够构成题目所要求的树还需要判断的条件是:


    所有点的入度和(InD_Num==N-1)或者(InD_Num==M)即可、


PS:输入负数表示结束。

 1 #include <iostream>
 2 #include <stdio.h>
 3 using namespace std;
 4 #define Max 100100
 5 int ID[Max];
 6 int InD[Max];
 7 int Out_Num;
 8 int Pio[Max];
 9 int SIGN;
10 int P_Num;
11 void Cread(int N)
12 {
13     for(int i=0;i<=N;i++){ID[i]=i;Pio[i]=1;InD[i]=1;}
14 }
15 int Find(int x)
16 {
17     int TMD=x,TMP;
18     while(TMD!=ID[TMD])TMD=ID[TMD];
19     while(x!=TMD)
20     {
21         TMP=ID[x];
22         ID[x]=TMD;
23         x=TMP;
24     }
25     return x;
26 }
27 void Update(int a,int b)
28 {
29     if(Pio[a]){P_Num++;Pio[a]=0;}
30     if(Pio[b]){P_Num++;Pio[b]=0;}
31     if(InD[b]){Out_Num++;InD[b]=0;}
32     int A=Find(a);
33     int B=Find(b);
34     if(A!=B)
35     {
36         ID[A]=B;
37         SIGN++;
38     }
39     else SIGN=Max;
40 }
41 int main()
42 {
43     int T,N,M,i,j,a,b,t=1;
44     Cread(Max);SIGN=0;P_Num=0;Out_Num=0;
45     while(scanf("%d%d",&a,&b)!=EOF)
46     {
47         if(a<0&&b<0)break;
48         if(a==0&&b==0)
49         {
50            // printf("%d %d %d\n",SIGN,Out_Num,P_Num);
51             if((SIGN==P_Num-1||P_Num==0)&&Out_Num==SIGN)
52                 printf("Case %d is a tree.\n",t++);
53             else
54                 printf("Case %d is not a tree.\n",t++);
55             Cread(Max);SIGN=0;P_Num=0;Out_Num=0;
56             continue;
57         }
58         Update(a,b);
59     }
60     return 0;
61 }

正解:(只需要根据树的定义,判断入度即可。。。)

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 using namespace std;
 5 int d[100005];
 6 bool bo[100005];
 7 int bianshu=0;
 8 void init(){
 9     memset(d,0,sizeof(d));
10     memset(bo,0,sizeof(bo));
11     bianshu=0;
12 }
13 int main(){
14     int x,y,cas=1;
15     while(~scanf("%d%d",&x,&y))
16     {
17         if(x==-1&&y==-1){
18             break;
19         }
20         if(x==0&&y==0){
21             int bobo=0;
22             int i;
23             for(i=1;i<=100000;i++){
24                 if(bo[i]&&d[i]==0){
25                     if(bobo==0) bobo=1;
26                     else break;
27                 }else
28                 if(bo[i]&&d[i]!=1){
29                     break;
30                 }
31             }
32             if(i<=100000) printf("Case %d is not a tree.\n",cas++);
33             else printf("Case %d is a tree.\n",cas++);
34             init();
35             continue;
36         }
37         d[y]++;
38         bo[x]=true;
39         bo[y]=true;
40         bianshu++;
41     }
42     return 0;
43 }



时间: 2024-10-26 21:29:56

(╭ ̄3 ̄)╭ 小希的迷宫II的相关文章

( ̄y▽ ̄)~ 智能手机II

( ̄y▽ ̄)~ 智能手机II TimeLimit: 3000/1000 MS (Java/Others)  MenoryLimit: 32768/32768 K (Java/Others) 64-bit integer IO format:%I64d Problem Description 在我们的手机通讯录中,我们可以通过输入手机号码时,搜索都联系人.如果当我们输入的手机号码正好也是另外一个手机号码的部分前缀时,同样会显示,前缀为这个手机号码的人的信息.只有当你输入的号码是唯一的,也就是输入的

【并查集】hdu 1272 小希的迷宫

[并查集]hdu 1272 小希的迷宫 并查集--并查集森林无环且连通 题目大意 给你连接关系构造一个图,判断图是否无环且满足连通性. 说一下思路 ①有无环:(a,b)元素a.b根节点是否相同,相同合并边就会成环,不满足题目要求 ②连通性:记录之前出现的节点,统计最后根节点==自身的节点个数,正好是1才是一片连通森林! ★再以后并查集初始化 i < _max,这道题有等号就WA了,不知道为什么??!!! 参考代码 //#pragma comment(linker, "/STACK:1024

HDU ACM 1272 小希的迷宫

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 31911    Accepted Submission(s): 9850 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

HDU 1272 小希的迷宫 (并查集)

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 27851    Accepted Submission(s): 8613 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

小希的迷宫--hdu1272(并查集)

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 34553    Accepted Submission(s): 10578 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

hdu 1272 小希的迷宫(简单并查集)

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 31396    Accepted Submission(s): 9726 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

HDOJ 1272.小希的迷宫

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30146 Accepted Submission(s): 9354 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,

HDU 1272: 小希的迷宫(并查集)

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 25010    Accepted Submission(s): 7683 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

ACM数论之旅13---母函数(又叫生成函数)(痛并快乐着(╭ ̄3 ̄)╭)

(前排出售零食瓜子) 前言:(????不看会吃亏的) 接下来要讲的算法比较难,一般人听不懂,因为你不能用常人的思想去理解 就像高数(说多了都是泪( >﹏<.)) 你要用常规方法去想肯定很累( ̄▽ ̄)~* 有时候一直半解的多读几遍反而高效 就像矩阵,发明矩阵的人是天才,我们只能在使用矩阵的同时一直感叹:“哇!好神奇!这样也可以!” 而不是先研究为什么他会有这么多神奇的性质 因为,毕竟从发明者角度来说,他就是考虑了这么多才创造出了神奇的矩阵 而如果矩阵的每一个性质你都一点点研究过去,终有一天,你也