http://poj.org/problem?id=1094
/*
文章大意是将n个字母排序(n<=26)。
最终必须排成链表式的输出
一旦确定或者出现环,记录当前步数,后续输入无视
*/
/*
加个拓扑排序判断图的总结:
1、如果输入的有向图中的点,不存在入度为0的点,则存在回路,反过来则不成立
2、如果入队的点的个数小于输入的点的个数,则肯定存在回路
3、如果存在的入度为零的点大于一个,则肯定不存在一个可以确定的序列
*/
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int n,m;
int In[26];
vector<int> top;
vector<int> G[26];
int top_sort()
{
int que[26*26];
int IN[26];
int i,j,p;
int l=0,r=0;
bool flag=false;
top.clear();
for(i=0;i<n;i++)
{
IN[i]=In[i];
if(In[i]==0)
que[r++]=i;
}
while(r>l)
{
if(r-l>1)
flag=true;
p=que[l++];
top.push_back(p);
for(i=0;i<G[p].size();i++)
{
int u=G[p][i];
IN[u]--;
if(IN[u]==0)
que[r++]=u;
}
}
if(top.size()<n)//当拓扑排序不确定的时候要先判断是否有环,特别注意!!!!!!!!!!!!
return 1;
if(flag) return 0;
return 2;
}
int main()
{
int i,j;
int state;
char str[26];
while(scanf("%d%d",&n,&m)&&n&&m)
{
state=0;
memset(G,0,sizeof(G));
memset(In,0,sizeof(In));
for(i=0;i<m&&state==0;i++)
{
scanf("%s",str);
int a=str[0]-'A';
int b=str[2]-'A';
In[b]++;
G[a].push_back(b);
state=top_sort();
}
for(j=i;j<m;j++)
scanf("%s",str);
if(state==0)
printf("Sorted sequence cannot be determined.\n");
else if(state==1)
printf("Inconsistency found after %d relations.\n",i);
else if(state==2)
{
printf("Sorted sequence determined after %d relations: ",i);
for(i=0;i<top.size();i++)
printf("%c",top[i]+'A');
printf(".\n");
}
}
return 0;
}