此题题目有点小问题,那也是很多人AC不了的原因:
问题是,当给定的前k项条件能够确定出大小顺序时,即便k项之后出现了矛盾条件,输出也应该是Sorted sequence determined after k relations 后面再输出排序好的序列!
#include <iostream>
#include <queue>
using namespace std;
#define SIZE 27
int inDegree[SIZE];
int graph[SIZE][SIZE];
int list[SIZE];
int map[SIZE];
int top_sort( int n )
{
int i,v,count = 0,temp[SIZE];
bool multi = false;
queue <int> q;
memcpy(temp,inDegree,sizeof(temp));
for ( i = 1; i <= n; i++ )
if ( temp[i] == 0 )
q.push(i);
while( !q.empty() )
{
v = q.front();
list[++count] = v;
q.pop();
if (!q.empty()) multi = true;
for ( i = 1; i <= n; i++ )
{
if ( graph[v][i] )
if ( --temp[i] == 0 )
q.push(i);
}
}
if (count != n) return 2;
if (multi) return 1;
else return 0;//determined
}
int main()
{
int veSta,veEnd,n,m,i,result,mark0,mark2,shown_vertex;
bool incon,deter;
char l,ch,r;
while ( cin >> n >> m )
{
if ( !m && !n ) break;
memset(graph,0,sizeof(graph));
memset(inDegree,0,sizeof(inDegree));
memset(map,0,sizeof(map));
incon = false;
deter = false;
mark0 = 0;
mark2 = 0;
shown_vertex = 0;
for ( i = 1; i <= m; i++ )
{
cin >> l >> ch >> r;
veSta = l-'A'+1;
veEnd = r-'A'+1;
if ( !graph[veSta][veEnd] )
{
graph[veSta][veEnd] = 1;
inDegree[veEnd]++;
}
if (!map[veSta] && shown_vertex < n)
{
shown_vertex++;
map[veSta] = 1;
}
if (!map[veEnd] && shown_vertex < n)
{
shown_vertex++;
map[veEnd] = 1;
}
if ( !incon && !deter ){
if ( graph[veEnd][veSta] == 1 )
{
incon = true;
mark2 = i;
}
else {
if ( shown_vertex == n )
{
result = top_sort(n);
if ( result == 1 )
continue;
else if ( result == 0 )
{
mark0 = i;
deter = true;
}
else if ( result == 2 )
{
mark2 = i;
incon = true;
}
}
}
}
}
if ( incon )
cout << "Inconsistency found after " << mark2 << " relations." << endl;
else if ( deter ){
cout << "Sorted sequence determined after "<< mark0 << " relations: ";
for ( i = 1; i <= n; i++ )
cout << (char)('A'+list[i]-1);
cout << '.' << endl;
}
else
cout << "Sorted sequence cannot be determined." << endl;
}
return 0;
}