zoukankan      html  css  js  c++  java
  • Rank of Tetris(topsort)

    http://acm.hdu.edu.cn/showproblem.php?pid=1811

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <queue>
     4 #include <vector>
     5 using namespace std;
     6 const int N=200010;
     7 vector<int>V[N];
     8 queue<int>q;
     9 char oper[N];
    10 int in[N],f[N];
    11 int a[N],b[N];
    12 int n,m,sum;
    13 void init()
    14 {
    15     sum = n;
    16     while(!q.empty()) q.pop();
    17     for (int i = 0; i <= n; i++)
    18     {
    19         f[i] = i;
    20         in[i] = 0;
    21         V[i].clear();
    22     }
    23 }
    24 int Find(int x)
    25 {
    26     if(x!=f[x]) return f[x]=Find(f[x]);
    27     return x;
    28 }
    29 int Merge(int x,int y)
    30 {
    31     x = Find(x);
    32     y = Find(y);
    33     if(x!=y)
    34     {
    35         f[y] = x;
    36         return 1;
    37     }
    38     return 0;
    39 }
    40 void toposort()
    41 {
    42     int flag = 0;
    43     for (int i = 0; i < n; i++)
    44     {
    45         if(in[i]==0&&Find(i)==i)
    46             q.push(i);
    47     }
    48     while(!q.empty())
    49     {
    50         if (q.size()>1)flag = 1;
    51         int u = q.front();
    52         q.pop();
    53         sum--;
    54         for (int i = 0 ; i < V[u].size(); i++)
    55         {
    56             if(--in[V[u][i]]==0)
    57                 q.push(V[u][i]);
    58         }
    59     }
    60     if (sum > 0) printf("CONFLICT
    ");
    61     else if (flag) printf("UNCERTAIN
    ");
    62     else printf("OK
    ");
    63 }
    64 int main()
    65 {
    66     while(~scanf("%d%d",&n,&m))
    67     {
    68         init();
    69         int u,v;
    70         for (int i = 0; i < m; i++)
    71         {
    72             scanf("%d %c %d",&a[i],&oper[i],&b[i]);
    73             if(oper[i]=='=')
    74             {
    75                 if(Merge(a[i],b[i]))
    76                     sum--;
    77             }
    78         }
    79         for (int i = 0; i < m; i++)
    80         {
    81             if(oper[i]=='=') continue;
    82             u = Find(a[i]);
    83             v = Find(b[i]);
    84             if(oper[i]=='>')
    85             {
    86                 V[u].push_back(v);
    87                 in[v]++;
    88             }
    89             if(oper[i]=='<')
    90             {
    91                 V[v].push_back(u);
    92                 in[u]++;
    93             }
    94         }
    95         toposort();
    96     }
    97     return 0;
    98 }
    View Code
  • 相关阅读:
    java反射机制
    Java注解的使用
    C3P0数据库Jar包的使用
    异常处理
    集合的概念
    程序员必备之二分查找
    ArrayList的使用
    HashMap的使用
    Final的使用
    类的基本结构
  • 原文地址:https://www.cnblogs.com/lahblogs/p/3573504.html
Copyright © 2011-2022 走看看