题意:
对于第一个例子:
4 6
A<B
A<C
B<C
C<D
B<D
A<B
若在输出第k行后所有字母都有序则输出:
Sorted sequence determined after k relations: y...yyy.
若在输出第k行后出现矛盾,则输出:
Inconsistency found after k relations.
若在输出m行后,仍无法排好序,则输出:
Sorted sequence cannot be determined.
思路:
用adj[30][30]来表示没两个字母之间的关系,adj[i][j]=0表示还没有确定i和j之间的关系,adj[i][j]=1表示i大于j,adj[i][j]=-1表示i小于j
最后根据每一个字母的sum值来进行排序,
代码:
# include<stdio.h>
# include<string.h>
# include<stdlib.h>
struct node{
int xuhao,sum;
}s[30];
int cmp(const void *a,const void *b)
{
struct node *c=(struct node *)a;
struct node *d=(struct node *)b;
return c->sum - d->sum;
}
int main()
{
int i,j,n,m,adj[30][30],ans1,ans2,k,flag,num;
char str[1000][5];
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0 && m==0) break;
memset(adj,0,sizeof(adj));
getchar();
for(i=1;i<=m;i++)
gets(str[i]);
flag=0;num=0;
for(i=1;i<=m;i++)
{
ans1=str[i][0]-'A'+1;
ans2=str[i][2]-'A'+1;
if(adj[ans1][ans2]==1 || str[i][0]==str[i][2]) {flag=1;break;} /*如果矛盾就退出循环*/
else if(adj[ans1][ans2]==0)/*如果这两个字母无序*/
{
for(j=1;j<=n;j++)
{
if(adj[j][ans1]==-1||j==ans1) /*描述所有比str[i][0]小的,包括它自身*/
{
for(k=1;k<=n;k++)
{
if((adj[k][ans2]==1||k==ans2)&&adj[j][k]==0)/*描述所有比str[i][2]大的,也包括它自身*/
{
/*adj[j][k]==0表示j和k无序*/
adj[j][k]=-1;
adj[k][j]=1;
num++;
}
}
}
}
if(num==n*(n-1)/2) {flag=2;break;}/*代表所有的字母都已有序*/
}
}
if(flag==1) printf("Inconsistency found after %d relations.\n",i);
else if(flag==2)
{
printf("Sorted sequence determined after %d relations: ",i);
for(j=0;j<=n;j++)
{
s[j].xuhao=j;
s[j].sum=0;
}
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
if(adj[j][k]==1) s[j].sum++;/*记录比字母j+'A'-1小的字母的个数*/
qsort(s+1,n,sizeof(s[1]),cmp);
for(j=1;j<=n;j++)
printf("%c",s[j].xuhao+'A'-1);
printf(".\n");/*小心还有一个点*/
}
else printf("Sorted sequence cannot be determined.\n");
}
return 0;
}
浙公网安备 33010602011771号