题意:
对于第一个例子:
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; }