拓扑排序的应用:
1、当前的输入序列排序唯一,则输出 Sorted sequence determined after %d relations
2、当前输入序列不唯一,检查是否有环
3、全部输入后,若排序唯一和有环,输出1、2,否则输出 Sorted sequence cannot be determined
拓扑排序 每次选点入度为0的点唯一 则排序唯一
否则排序结果不唯一
若某次选择点,不存在入度为0的点,则有环
#include <stdio.h>
#include <string.h>
int topo(int succ[][26],int *inp,int *outp,int n,int *numbersucc,int *result)
{
int in[26],out[26];
int i,j,firstnode,cnt,k=0,tempnode;
bool isonly = true;
for (i=0;i<n;i++)
{
in[i] = inp[i];
out[i] = outp[i];
}
while(1)
{
cnt = 0;
for (i=0;i<n;i++)
{
if (in[i]==0) //找入度为0的点 并统计个数
{
cnt++;
if (cnt==1)
firstnode = i;
if (cnt>1)
isonly = false ; //在排序的过程中有一次入度为0 的点 不唯一排序不唯一
}
}
if (cnt==0) //没有入度为0的点 说明存在环
return 2;
*(result+k) = firstnode;
in[firstnode] = -1; //已排好
k++; //k代表已经排好序的数量
if (k==n)
break;
for (i=0;i<numbersucc[firstnode];i++)
{
tempnode = succ[firstnode][i];
in[tempnode] -- ;
out[firstnode] -- ;
}
}
if (isonly)
return 1;
else
return 0;
}
int main()
{
int n,m,i,j,succnode[26][26],indegree[26],outdegree[26],flag,numbersucc[26],result[26];
bool succ[26][26];
char A,B;
while(1)
{
scanf("%d%d",&n,&m);
if (n==0&&m==0)
break;
memset(succ,false,sizeof(succ));
memset(indegree,0,sizeof(indegree));
memset(outdegree,0,sizeof(outdegree));
memset(succnode,-1,sizeof(succnode));
memset(numbersucc,0,sizeof(numbersucc));
flag = 0;
for (i=1;i<=m;i++)
{
getchar();
scanf("%c",&A);
getchar();
scanf("%c",&B);
if (!flag)
{
B -= 'A';
A -= 'A';
if (succ[B][A] == false) //从来没出现过 若之前出现过可以pass掉
{
succ[B][A] = true; //B后面跟着A
indegree[A]++;
outdegree[B]++;
succnode[B][numbersucc[B]++] = A; //
flag = topo(succnode,indegree,outdegree,n,numbersucc,result);
if (flag == 1)
{
printf("Sorted sequence determined after %d relations: ",i);
for (j=n-1;j>=0;j--)
printf("%c",result[j]+'A');
printf(".\n");
}
else if (flag == 2)
{
printf("Inconsistency found after %d relations.\n",i);
}
}
}
}
if (flag == 0)
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}