zoj1060Sorting It All Out

题意:

对于第一个例子:

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;

}

你可能感兴趣的:(sort)