zoukankan      html  css  js  c++  java
  • (╭ ̄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
    ",SIGN,Out_Num,P_Num);
    51             if((SIGN==P_Num-1||P_Num==0)&&Out_Num==SIGN)
    52                 printf("Case %d is a tree.
    ",t++);
    53             else
    54                 printf("Case %d is not a tree.
    ",t++);
    55             Cread(Max);SIGN=0;P_Num=0;Out_Num=0;
    56             continue;
    57         }
    58         Update(a,b);
    59     }
    60     return 0;
    61 }
    View Code
    正解:(只需要根据树的定义,判断入度即可。。。)
     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.
    ",cas++);
    33             else printf("Case %d is a tree.
    ",cas++);
    34             init();
    35             continue;
    36         }
    37         d[y]++;
    38         bo[x]=true;
    39         bo[y]=true;
    40         bianshu++;
    41     }
    42     return 0;
    43 }
    View Code


    转载请备注:
    **************************************
    * 作者: Wurq
    * 博客: https://www.cnblogs.com/Wurq/
    * Gitee: https://gitee.com/wurq
    **************************************
  • 相关阅读:
    Centos7安装nodejs(npm)
    Centos7安装docker
    在目标服务器Centos7上安装 GitLab Runner
    PC端,知乎在不想登录的情况下一打开就弹出登录框的无痛解决办法
    mac下webstrom卡顿快速解决办法
    解决项目中使用momentJS文件 体积过大的问题
    发布订阅模式及多种实现方式:
    「react进阶」react开发者的不得不知道的八条优化建议
    Gulp、Webpack 有什么区别
    react 源码解析(上)
  • 原文地址:https://www.cnblogs.com/Wurq/p/4693318.html
Copyright © 2011-2022 走看看