POJ-1094-Sorting It All Out

来源:互联网 发布:手机刷單软件 编辑:程序博客网 时间:2024/05/16 07:39

POJ-1094-Sorting It All Out

http://poj.org/problem?id=1094

给你一些关系式,判断这些关系式能不能唯一确定一个升序序列。

输入有三种情况:

1.经过n步能确定这n个字母的唯一的有序序列,输出Sortedsequence determined after %d relations: 

2.出现环输出Inconsistencyfound after %d relations.

3.经过m次关系判断后,还不能唯一确定升序序列。输出Sortedsequence cannot be determined.

#include<stdio.h>#include<stdlib.h>#include<string.h>#define M 27int in[M],temp[M],tuopu[M];int visit[M][M];int n,m;//字母数,边数int tuopusort()  {int i,j,u,v,count;int flag=1;int num;//入度为0的字母 count=1;//已排序字母个数  memset(tuopu,0,sizeof(tuopu));for(i=1;i<=n;i++)temp[i]=in[i];for(i=1;i<=n;i++){num=0;for(j=1;j<=n;j++)  //入度为0的点if(temp[j]==0){u=j;num++;}if(num==0)  //含有环return 0;if(num>1) //有多个入度为0的点,拓扑排序不止一种flag=0; //刚开始直接return -1,WA了一次。。。temp[u]=-1;tuopu[count++]=u; //加入拓扑序列for(j=1;j<=n;j++) //删边if(visit[u][j]==1)temp[j]--;}if(flag==0)return -1;return 1;  //排序成功}int main(){char str[5];int i,j,start,end;int flag,ans;while(scanf("%d%d",&n,&m)!=EOF,n&&m){memset(in,0,sizeof(in));memset(visit,0,sizeof(visit));flag=1;for(i=1;i<=m;i++){scanf("%s",str);if(flag==0)  //出现环continue;start=str[0]-'A'+1;end=str[2]-'A'+1;in[end]++;visit[start][end]=1;ans=tuopusort(); //加一条进行拓扑排序if(ans==0) //出现环{printf("Inconsistency found after %d relations.\n", i);  flag=0;}else if(ans==1){printf("Sorted sequence determined after %d relations: ", i);  for(j=1;j<=n;j++)printf("%c",tuopu[j]+'A'-1);printf(".\n");flag=0;}}if(flag)printf("Sorted sequence cannot be determined.\n");  }return 0;}


原创粉丝点击