这题的代码是我写过的最丑陋的代码,没有之一。。
基本上每个trick都被我遇到了。拓扑排序也快忘得差不多了。
题意:给出一些关系,判断关系之间的是否矛盾,在哪里开始的,若不矛盾,判断能否理清各个变量间的优先级排列,若能理清,在哪里开始能理清的,并输出优先级排列(从低到高)。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
int n,m,t,i,status,j,k,ls,l,ans,map[27][27],in[27],tin[27],sdf;
char t1,t2,str[100];
while (1)
{
memset(map,0,sizeof(map));
memset(in,-1,sizeof(in));
status=3;
scanf("%d%d",&n,&m);
getchar();
if (n == 0 && m == 0)
break;
for (i=0; i<m; i++)
{
scanf("%c%*c%c%*c",&t1,&t2);
if (status != 3)
continue;
map[t2-'A'][t1-'A']=1;
if (in[t1-'A'] == -1)
in[t1-'A']=0;
if (in[t2-'A'] == -1)
in[t2-'A']=0;
in[t1-'A']++;
ls=n-1;
memcpy(tin,in,sizeof(tin));
int flag=1;
for (j=0; j<n; j++)
{
int asdf=0;
sdf=-1;
for (k=0; k<n; k++)
{
if (in[k] == 0 && sdf != -1)
{
flag=0;
break;
}
if (in[k] == -1)
asdf++;
if (in[k] == 0)
sdf=k;
}
if (flag == 0)
{
if (sdf == -1 && asdf != n)
{
status=2;
ans=i+1;
break;
}
if (asdf == n)
break;
in[sdf]=-1;
for (l=0; l<n; l++)
{
if (map[sdf][l] == 1)
in[l]--;
}
continue;
}
if (sdf == -1 && asdf != n)
{
status=2;
ans=i+1;
break;
}
if (asdf == n)
break;
str[ls]=sdf+'A';
in[sdf]=-1;
for (l=0; l<n; l++)
{
if (map[sdf][l] == 1)
in[l]--;
}
/* for (l=0; l<n; l++)
printf("%d ",in[l]);
printf("\n");
*/
ls--;
}
if (j == n && flag != 0)
{
status=1;
str[n]='\0';
ans=i+1;
}
memcpy(in,tin,sizeof(in));
}
switch(status)
{
case 1:
printf("Sorted sequence determined after %d relations: %s.\n",ans,str);
break;
case 2:
printf("Inconsistency found after %d relations.\n",ans);
break;
case 3:
printf("Sorted sequence cannot be determined.\n");
break;
}
}
}