题意:

对于第一个例子:

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;
}
posted on 2011-04-07 14:23  奋斗青春  阅读(134)  评论(0编辑  收藏  举报