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

    https://vjudge.net/problem/HDU-1272

    思路:
    被这题卡了半天,妈的智障。
    首先,还是没有仔细审题的问题,这题抽象出来就是判断一个图是否为无环的只有一个连通分量的图。直接用并查集做就好了。谨记审题仔细。

      1 #include <stdio.h>
      2 #include <string.h>
      3 
      4 int par[200005];
      5 int ran[200005];
      6 bool v[100005];
      7 
      8 void init(void)
      9 {
     10     for (int i = 0;i < 200005;i++)
     11         par[i] = i;
     12 }
     13 
     14 int fin(int x)
     15 {
     16     if (x == par[x])
     17         return x;
     18     else
     19         return par[x] = fin(par[x]);
     20 }
     21 
     22 bool unit(int x,int y)
     23 {
     24     x = fin(x);
     25     y = fin(y);
     26 
     27     if (x == y) return 0;
     28 
     29     if (ran[x] < ran[y])
     30     {
     31         par[x] = y;
     32     }
     33     else
     34     {
     35         par[y] = x;
     36 
     37         if (ran[x] == ran[y]) ran[x]++;
     38     }
     39 
     40     return 1;
     41 }
     42 
     43 int main()
     44 {
     45    while (1)
     46    {
     47        memset(par,0,sizeof(par));
     48        memset(ran,0,sizeof(ran));
     49         memset(v,0,sizeof(v));
     50 
     51        bool f = 0,fa = 0;
     52 
     53        int ma = 0;
     54 
     55        init();
     56 
     57        int a,b;
     58 
     59        while (scanf("%d%d",&a,&b) == 2)
     60        {
     61            if (a == -1 && b == -1)
     62            {
     63                f = 1;
     64                break;
     65            }
     66 
     67             if (a * b == 0) break;
     68 
     69             v[a] = 1;v[b] = 1;
     70 
     71             if (b > ma) ma = b;
     72             if (a > ma) ma = a;
     73 
     74            if (!unit(a,b))
     75            {
     76                fa = 1;
     77            }
     78 
     79        }
     80 
     81        if (f) break;
     82 
     83        if (fa)
     84        {
     85            printf("No
    ");
     86        }
     87        else
     88        {
     89            int rt = fin(ma);
     90 
     91            bool ff = 0;
     92 
     93            for (int i = 1;i <= ma;i++)
     94             if (v[i] && fin(i) != rt) ff = 1;
     95 
     96             if (ff) printf("No
    ");
     97             else printf("Yes
    ");
     98        }
     99 
    100    }
    101 
    102     return 0;
    103 }
    犹豫就会败北!
  • 相关阅读:
    【转】用户权限管理经典篇
    [转]提高精简框架集程序的性能
    迷你电话本
    Serial Communication via RS232 Port
    wxWidgets类列表(2.6.4)
    Parallel Port Programming (Part 2): with Visual C++
    [转]WINCE的编程忠告
    宽字符处理函数函数与普通函数对照表
    [转]C# 解析配置文件内容 System.Configuration
    Parallel Port Programming (Part 1): with C
  • 原文地址:https://www.cnblogs.com/kickit/p/7147007.html
Copyright © 2011-2022 走看看