这题很奇怪,在zoj上一直过不了,不知道问题出现在哪里。不过在poj上过了
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
using namespace std;
int kcount[26];//入边表,记录定点的入度
int temp[26];//就是kcount的拷贝,在拓扑排序时用于修改
char relation[3],seq[26];//relation用于读入对象的关系,seq用于储存得到的序列
bool alpha[26];//alpha用于检查对象是否检查过
int n, m;
vector< vector< char > >v;
//一般思路可以先建好图再进行拓扑排序,但是本题要求在第几个关系式下可以判断出来,因此要输入一次,就进行一次拓扑排序;
//拓扑排序时,用了一个flag标志变量,如果
int TopSort( int s )
{
int i, j, r, cnt;//r表示得到的序列中元素个数,cnt表示定点入度为零的个数
bool flag;//flag标志变量,查看拓扑排序结束后,是否能够得到序列
r = 0, cnt = 0;
for(i = 0; i < n; ++i)
temp[i] = kcount[i];
flag = 1;
while(s--)
{
cnt = 0;
for(i = 0; i < n; ++i)
{
if(temp[i] == 0)
j = i, cnt++;
}
if(cnt >= 1)
{
//cnt = 1;表明就有一个入度为零的定点,那么该定点就位于序列的最前端
if(cnt > 1)
flag = 0;
int h = v[j].size();
for(i = 0; i < h; ++i)
temp[ (int)v[j][i] ]--;
seq[r++] = (char)(j + 'A');
temp[j] = -1;
seq[r] = 0;
}
else if(cnt == 0)
return -1;
}
if(flag)
return r;
else
return 0;
}
int main()
{
int i, t, k, c;
int determed;
char tmp[26];
while(1)
{
cin>>n>>m;
if(n == 0 && m == 0)
break;
memset(kcount, 0, sizeof(kcount));
memset(alpha, false, sizeof(alpha));
v.clear(), v.resize(n);
c = 0, determed = 0;
for(i = 0; i < m; ++i)
{
cin>>relation;
kcount[ relation[2] - 'A' ]++;
v[ relation[0] - 'A' ].push_back( relation[2] - 'A' );
if( !alpha[ relation[0] - 'A' ] )
c++, alpha[ relation[0] - 'A' ] = true;
if( !alpha[ relation[2] - 'A' ] )
c++, alpha[ relation[2] - 'A' ] = true;
if( determed == 0)
{
t = TopSort( c );
if( t == -1 )
{
determed = -1;
k = i+1;
}
else if(t == n)
{
determed = 1;
k = i+1;
strcpy(tmp, seq);
}
}
}
if(determed == 1)
cout<<"Sorted sequence determined after "<<k<<" relations: "<<tmp<<"."<<endl;
else if(determed == 0)
cout<<"Sorted sequence cannot be determined."<<endl;
else
cout<< "Inconsistency found after "<<k<< " relations."<<endl;
}
return 0;
}