拓扑序列变形 之 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 }
 
 
原文地址:https://www.cnblogs.com/shijianming/p/5055923.html