您的位置:首页 > 其它

POj 1094 Sorting it All Out

2010-11-08 20:57 417 查看
解题思路:每增加一个点,均判断其拓扑排序,如果首先发现可以排序的情况,则不管后面的输入情况是否出现环。

#include <iostream>
#include <stack>
using namespace std;

int main()
{
int n, m, t, L;
char u, v, ch, seq[26];
bool edge[26][26], comeOut[26];
int degree[26], tdeg[26];

stack<int>temp;
string str;
bool flag1, flag2, flag;

while (cin >> n >> m && n * n + m * m)
{
while (!temp.empty())
temp.pop();
flag1 = flag2 = true;
t = 0;

fill(&edge[0][0], &edge[25][26], false);
memset(degree, 0, sizeof(int) * 26);
memset(comeOut, 0, sizeof(bool) * 26);

for (int i = 1; i <= m; i++)
{
cin >> u >> ch >> v;
if (!(flag1 && flag2))
continue;
if (!edge[u - 'A'][v - 'A'])
{
if(!comeOut[u - 'A'])
{
t++;
comeOut[u - 'A'] = true;
}
if (!comeOut[v - 'A'])
{
t++;
comeOut[v - 'A'] = true;
}
edge[u - 'A'][v - 'A'] = true;
degree[v - 'A']++;

flag = (t == n) ? true : false;
for (int j = 0; j < n; j++)
{
tdeg[j] = degree[j];
if (comeOut[j] && tdeg[j] == 0)
temp.push(j);
}
if (flag && temp.size() > 1)
flag = false;
int index = 0;
while (!temp.empty())
{
int ts = temp.top();
seq[index++] = 'A' + ts;

temp.pop();
for (int j = 0; j < n; j++)
if (edge[ts][j])
{
tdeg[j]--;
if (tdeg[j] == 0)
temp.push(j);
}
if (flag && temp.size() > 1)
flag = false;
}
for (int j = 0; (j < n) && flag2; j++)
if (tdeg[j] != 0)
{
L = i;
flag2 = false;
}
if (t == n && flag && flag2)
{
L = i;
flag1 = false;
}
}
}

if (!flag1)
{
cout << "Sorted sequence determined after " << L << " relations: ";
for (int i = 0; i < n; i++)
cout << seq[i];
cout << "." << endl;
}
else if(!flag2)
cout << "Inconsistency found after " << L << " relations."<<endl;
else
cout << "Sorted sequence cannot be determined." << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: