这题挺奇怪的,我之前还真么做过这样的拓扑排序,之前卡了一阵子,这个题目是判断到第几个成环,到第几个正好能唯一排序,另一种就是怎么也排不了序,就是每个数据跑一遍拓扑排序就行了
#include <iostream>
#include <queue>
#include <string.h>
#include <stdio.h>
using namespace std;
const int maxn=30;
int head[maxn],ip,indegree[maxn];
int n,m,seq[maxn];
struct note
{
int v,next;
}edge[maxn*maxn];
void init()
{
memset(head,-1,sizeof(head));
memset(indegree,0,sizeof(indegree));
memset(seq,0,sizeof(seq));
ip=0;
}
void addedge(int u,int v)
{
edge[ip].v=v;
edge[ip].next=head[u];
head[u]=ip++;
}
int topo()
{
queue<int>q;
int indeg[maxn];
for(int i=0;i<n;i++)
{
indeg[i]=indegree[i];
if(indeg[i]==0)
q.push(i);
}
int k=0;
bool res=false;
while(!q.empty())
{
if(q.size()!=1)
res=true;
int u=q.front();
q.pop();
seq[k++]=u;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
indeg[v]--;
if(indeg[v]==0)
q.push(v);
}
}
if(k<n) return -1;//成环
if(res)
return 0;//多解
return 1;//唯一解
}
int main()
{
while(cin>>n>>m)
{
init();
int sign=0;
if(n==0&&m==0)
break;
int flag=0;
for(int i=0;i<m;i++)
{
char s1,s2,s3;
cin>>s1>>s2>>s3;
if(sign==1)//如果输出过了,对后面的数据就跳过就行了
continue;
int u=s1-'A';
int v=s3-'A';
sign=0;
addedge(u,v);
indegree[v]++;//这块千万别忘了
flag=topo();
if(flag==-1)
{
sign=1;
cout<<"Inconsistency found after "<<i+1<<" relations."<<endl;
}
else if(flag==1)
{
sign=1;
//cout<<i<<endl;
cout<<"Sorted sequence determined after "<<i+1<<" relations: ";
for(int j=0;j<n;j++)//这里一定是小于n,不能是小于i,要保证个数
putchar(seq[j]+'A');//这块注意,用putchar输出字符
cout<<"."<<endl;
}
else
{
continue;
}
}
if(sign==0)
cout<<"Sorted sequence cannot be determined."<<endl;
}
return 0;
}