zoukankan      html  css  js  c++  java
  • 拓扑序列变形 之 poj 1094 Sorting It All Out

    
    
    /*
    拓扑序列变形 之 poj 1094 Sorting It All Out
     
    变形:
    	在每消去唯一一个入度为0的点后,只剩下唯一一个入度为0的点。
    	这样获得的n个点才是排序好的。
    */
      1 #include <iostream>
      2 #include <cstdlib>
      3 #include <cstdio>
      4 #include <cstddef>
      5 #include <iterator>
      6 #include <algorithm>
      7 #include <string>
      8 #include <locale>
      9 #include <cmath>
     10 #include <vector>
     11 #include <cstring>
     12 #include <map>
     13 #include <utility>
     14 #include <queue>
     15 #include <stack>
     16 #include <set>
     17 #include <functional>
     18 using namespace std;
     19 typedef pair<int, int> PII; 
     20 typedef long long int64;
     21 const int INF = 0x3f3f3f3f;
     22 const int modPrime = 3046721;
     23 const double eps = 1e-9;
     24 const int MaxN = 30;
     25 const int MaxM = 10010;
     26 
     27 int n, m;
     28 bool G[MaxN][MaxN];
     29 int ndCnt[MaxN];
     30 char chList[MaxN];
     31 
     32 enum emFlag
     33 {
     34     fgSUCCESS, fgFAIL, fgWAIT
     35 };
     36 
     37 
     38 emFlag Solve()
     39 {
     40     stack<int> stk;
     41 
     42     int ndCntTmp[MaxN];
     43     for (int i = 0; i < n; ++i)
     44     {
     45         ndCntTmp[i] = ndCnt[i];
     46         if (0 == ndCnt[i])
     47         {
     48             stk.push(i);
     49         }
     50     }
     51 
     52     bool sign = true;
     53     int chLen = 0;
     54 
     55     while (!stk.empty())
     56     {
     57         // 下面的if语句,就是需要注意的地方
     58         if (stk.size() > 1)
     59         {
     60             sign = false;
     61         }
     62         int nd = stk.top();
     63         stk.pop();
     64         chList[chLen++] = static_cast<char> ('A' + nd);
     65         for (int i = 0; i < n; ++i)
     66         {
     67             if (G[nd][i])
     68             {
     69                 --ndCntTmp[i];
     70                 if (0 == ndCntTmp[i])
     71                 {
     72                     stk.push(i);
     73                 }
     74             }
     75         }
     76     }
     77 
     78     if (n == chLen)
     79     {
     80         if (sign)
     81         {
     82             return fgSUCCESS;
     83         }
     84         else
     85         {
     86             return fgWAIT;
     87         }
     88     }
     89     else
     90     {
     91         return fgFAIL;
     92     }
     93 }
     94 
     95 void ini()
     96 {
     97     for (int i = 0; i < n; ++i)
     98     {
     99         ndCnt[i] = 0;
    100         for (int j = 0; j < n; ++j)
    101         {
    102             G[i][j] = false;
    103         }
    104     }
    105 }
    106 
    107 int main()
    108 {
    109 #ifdef HOME
    110     freopen("in", "r", stdin);
    111     //freopen("out", "w", stdout);
    112 #endif
    113     string str;
    114     while ((cin >> n >> m) && (n || m))
    115     {
    116         ini();
    117 
    118         bool sign = false;
    119         int pos;
    120         emFlag fg = fgWAIT;
    121         for (int i = 1; i <= m; ++i)
    122         {
    123             cin >> str;
    124             if (!sign)
    125             {
    126                 int a = str[0] - 'A', b = str[2] - 'A';
    127                 if (!G[a][b])
    128                 {
    129                     G[a][b] = true;
    130                     ++ndCnt[b];
    131                     fg = Solve();
    132                     if (fg != fgWAIT)
    133                     {
    134                         pos = i;
    135                         sign = true;
    136                     }
    137                 }
    138             }
    139         }
    140         if (sign)
    141         {
    142             if (fgSUCCESS == fg)
    143             {
    144                 cout << "Sorted sequence determined after " << pos << " relations: ";
    145                 for (int j = 0; j < n; ++j)
    146                 {
    147                     cout << chList[j];
    148                 }
    149                 cout << "." << endl;
    150             }
    151             else
    152             {
    153                 cout << "Inconsistency found after " << pos << " relations." << endl;
    154             }
    155         }
    156         else
    157         {
    158             cout << "Sorted sequence cannot be determined." << endl;
    159         }
    160     }
    161 
    162 #ifdef HOME
    163     cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
    164     _CrtDumpMemoryLeaks();
    165 #endif
    166     return 0;
    167 }
     
     
  • 相关阅读:
    深入探讨多态性及其在Java中的好处
    可扩展的Java线程池执行器
    Java并发:线程限制
    CF集萃3
    CF1151F
    [欧拉路]CF1152E Neko and Flashback
    LOJ#3119 随机立方体
    UOJ#449 喂鸽子
    CF1140F
    洛谷P5071 此时此刻的光辉
  • 原文地址:https://www.cnblogs.com/shijianming/p/5055923.html
Copyright © 2011-2022 走看看