zoukankan      html  css  js  c++  java
  • HDU 1272 小希的迷宫

                                                             小希的迷宫

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 32186    Accepted Submission(s): 9944


    Problem Description
    上次Gardon的迷宫城堡小希玩了非常久(见Problem B),如今她也想设计一个迷宫让Gardon来走。可是她设计迷宫的思路不一样,首先她觉得全部的通道都应该是双向连通的。就是说假设有一个通道连通了房间A和B,那么既能够通过它从房间A走到房间B,也能够通过它从房间B走到房间A,为了提高难度,小希希望随意两个房间有且仅有一条路径能够相通(除非走了回头路)。小希如今把她的设计图给你。让你帮忙推断她的设计图是否符合她的设计思路。

    比方以下的样例,前两个是符合条件的。可是最后一个却有两种方法从5到达8。

     

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

    每两组数据之间有一个空行。
    整个文件以两个-1结尾。


     

    Output
    对于输入的每一组数据。输出仅包含一行。假设该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。
     

    Sample Input
    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
     

    Sample Output
    Yes Yes No
     

    近期在做bin神挂的题,按顺序一点点来吧

    #include <iostream>
    #include <stdio.h>
    #include <string>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #define N 111129
    using namespace std;
    
    int fa[N];
    int vis[N];
    
    int findfa(int x)
    {
        if(fa[x]!=x)
        fa[x]=findfa(fa[x]);
    
        return fa[x];
    }
    
    void uniontwo(int x,int y)
    {
        int xx=findfa(x);
        int yy=findfa(y);
    
        if(xx<yy)
        fa[yy]=xx;
        else
        fa[xx]=yy;
    }
    
    int main()
    {
        int a,b;
        while(~scanf("%d %d",&a,&b))
        {
           if(a==-1 && b==-1) break;
            int min=100019;
            int max=-109;
            int flag=0;
    
            if(a==0 && b==0)
            {
                cout<<"Yes
    ";
                continue;
            }
    
            for(int i=0;i<=111119;i++)
            {
                fa[i]=i;
                vis[i]=0;
            }
    
            while(a||b)
            {
                if(a<min) min=a;
                if(b<min) min=b;
                if(a>max) max=a;
                if(b>max) max=b;
    
                vis[a]=1;vis[b]=1;
    
                int xx=findfa(a);
                int yy=findfa(b);
                if(xx==yy)//判一下有不有环
                flag=1;
                else
                uniontwo(a,b);
    
                scanf("%d %d",&a,&b);
            }
    
            int num=0;
    
            if(flag==1)
            cout<<"No"<<endl;
            else
            {
                for(int i=min;i<=max;i++)//范围内出现过的数,判一下是不是仅仅有一个连通块
                {
                    if(vis[i] && fa[i]==i)
                    num++;
                }
                if(num==1)
                cout<<"Yes"<<endl;
                else
                cout<<"No"<<endl;
            }
    
        }
        return 0;
    }
    








  • 相关阅读:
    Windows Azure Web Site (19) Azure Web App链接到VSTS
    Windows Azure Virtual Machine (35) Azure VM通过Linked DB,执行SQL Job
    Azure PowerShell (16) 并行开关机Azure ARM VM
    Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering
    Azure ARM (21) Azure订阅的两种管理模式
    Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户
    Azure ARM (20) 将非托管磁盘虚拟机(Unmanage Disk),迁移成托管磁盘虚拟机(Manage Disk)
    Azure ARM (19) 将传统的ASM VM迁移到ARM VM (2)
    Azure ARM (18) 将传统的ASM VM迁移到ARM VM (1)
    Azure Automation (6) 执行Azure SQL Job
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7246533.html
Copyright © 2011-2022 走看看