• ACM: poj 1094 Sorting It All Out


    poj 1094 Sorting It All Out

    Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & %llu

    Description

    An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.

    Input

    Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n <= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.

    Output

    For each problem instance, output consists of one line. This line should be one of the following three: 

    Sorted sequence determined after xxx relations: yyy...y. 
    Sorted sequence cannot be determined. 
    Inconsistency found after xxx relations. 

    where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence. 

    Sample Input

    4 6
    A<B
    A<C
    B<C
    C<D
    B<D
    A<B
    3 2
    A<B
    B<A
    26 1
    A<Z
    0 0
    

    Sample Output

    Sorted sequence determined after 4 relations: ABCD.
    Inconsistency found after 2 relations.
    Sorted sequence cannot be determined.

    /*/
    给出字母个数和提示次数,排出ABCD......的大小
    
    按照格式[c1]<[c2]输入,请判断是否能够按照输入严格排序,如果可以就输出在第多少次输入后就已经成功排序,并且输出排序的队列 ;
    【Sorted sequence determined after xxx relations: yyy...y.】
    
    如果输完后不能够按照大小严格排序,就输出不可以成功排序【Sorted sequence cannot be determined. 】
    
    如果在输入后出现了A>B,B<A的矛盾输出矛盾出现的次数【Inconsistency found after xxx relations. 】
    
    要注意中途记录输入的次数,或者按照输入一次判断一次,随时对输入进行终止,但是要注意后面继续输入的吸收。
    
    
    思路,用拓扑排序进行解题,每组进行输入如果排序过程中严格递增即入度为0的点只有一个,就正常排序。
    
    如果出现入度为0的点有多个则就是说明有的点没有严格排序,要再次进行排序,直到输入结束后还是有多个入度==0的点,就说明不能够成功排序。
    
     如果出现某次找不到入度为0的点,说明已经成环即出现矛盾。可以结束这次排序了。

    AC代码: /
    */
    #include"algorithm"
    #include"iostream"
    #include"cstring"
    #include"cstdlib"
    #include"string"
    #include"cstdio"
    #include"vector"
    #include"cmath"
    #include"queue"
    using namespace std;
    #define memset(x,y) memset(x,y,sizeof(x))
    #define memcpy(x,y) memcpy(x,y,sizeof(x))
    #define MX 30
    int cnt;
    int map[MX][MX]; //邻接矩阵
    int indegree[MX]; //入度
    int flag;
    
    queue<int >q;
    
    int toposort(int map[MX][MX],int n) {
    	int mp[MX][MX];
    	memcpy(mp,map);
    	memset(indegree,0);
    	for(int j=0; j<n; j++) {
    		for(int k=0; k<n; k++) {
    			if(mp[j][k]==1) {
    				indegree[k]++;
    			}
    		}
    	}
    	flag=-1;
    	queue<int> qq;
    	for (int i=0; i<n;) {
    		int count=0;
    		for (int j=0; j<n; j++) {
    			if (indegree[j]==0) count++;//记录入度为0的点的数量
    		}
    		if(!count)return 2;//有环。
    		if(count>1) flag=1;//如果入度为0的点大于一个无法判断他的唯一排序性
    		for(int j=0; j<n; j++) {
    			if(!indegree[j]) {
    				++i;
    				qq.push(j);
    				for (int k=0; k<n; k++) {
    					if (mp[j][k]) {
    						indegree[k]--; //减少入度
    						mp[j][k]=0; //删边
    					}
    				}
    				indegree[j]=-1;
    				break;//一次循环消除一个点
    			}
    		}
    	}
    	if(flag!=1) { //判断是否需要维护队列 是否进行了消边操作 如果flag!=1则说明无法再进行消边操作,即已经全部排序好了。
    		q=qq;
    		return 0; //
    	} else return 1;//还未结束
    }
    
    int main() {
    	char s[10];
    	memset(s,0) ;
    	int n,m,st,ed;
    //	freopen("in.txt", "r", stdin);
    	while(~scanf("%d %d",&n,&m)) {
    		if(!m&&!n)break;
    		cnt=0;
    		flag=-1;
    		memset(map,0);
    		for(int i=1; i<=m; i++) {
    			scanf("%s",s);
    			st=(int)s[0]-'A';
    			ed=(int)s[2]-'A';
    			map[st][ed]=1;
    			if (flag==0||flag==2) continue;//如果已经成环或者已经无法再操作了就跳过操作 吸收后面的输入
    			else flag=toposort(map,n);
    			if(flag==0) {
    				printf("Sorted sequence determined after %d relations: ",i);
    				while (!q.empty()) {
    					int ch=q.front();
    					q.pop();
    					printf("%c",ch+'A');
    				}
    				puts(".");
    			} else if (flag==2) {
    				printf("Inconsistency found after %d relations.
    ",i);
    			}
    		}
    
    		if (flag==1)puts("Sorted sequence cannot be determined.");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    视频实时增强算法
    FFMPEG中关于ts流的时长估计的实现(转)
    从二维码技术看抢占技术至高点的重要性
    专家观点:不断茁壮的音频生态系统中心(转)
    理解音响系统和房间的相互作用---房间脉冲响应
    Fraunhofer音频技术为MPEG未来高品质3D音频内容传输的标准依据
    Cortex-A15架构解析:它为什么这么强(转)
    骨传导技术(转)
    Faker伪数据生成
    Python数据库连接池DBUtils
  • 原文地址:https://www.cnblogs.com/HDMaxfun/p/5741659.html
Copyright © 2020-2023  润新知