zoukankan      html  css  js  c++  java
  • POJ 1094:Sorting It All Out拓扑排序之我在这里挖了一个大大的坑

    Sorting It All Out
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 29984   Accepted: 10373

    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.

    拓扑排序,看了算法导论上说用的是深搜的方法,结果看到这道题想都没想就用深搜,改了一天还是TLE。。。自己也觉得时间怎么这么长,疯了。看其他人的思路,结果结果,就是离散数学时候的那种最简单的方法啊,每一轮找入度为0的那一个啊,把这一个节点连带着与它一块的那些边一起删啊,然后再删啊,看有没有一轮入度都不为0的就坏菜了,就成环了啊,就是这么很简单的思路啊,折腾了那么久。。。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <cstdio>
    #include <vector>
    #include <string>
    #include <cstring>
    #include <list>
    #pragma warning(disable:4996)
    using namespace std;
    
    int connect[30][30],indegree[30];
    int queue[30];
    int n,m,flag;
    
    //我考虑的状况全是多余,不去想的情况全是考点
    
    int solve()
    {
    	int i,j,loc,m,num=0,temp[30],re=1;
    	for(i=1;i<=n;i++)
    	{
    		temp[i]=indegree[i];
    	}
    
    	for(j=1;j<=n;j++)
    	{
    		m=0;
    		for(i=1;i<=n;i++)
    		{
    			if(temp[i]==0)
    			{
    				m++;
    				loc=i;
    			}
    		}
    		if(m==0)
    			return -1;
    		else if(m>1)
    		{
    			re=0;//有两个以上的入度为0的数,说明不确定。
    			     //但此时不能返回值,因为后面可能会有矛盾的地方,即return-1的时候
    		}
    		queue[++num]=loc;
    		temp[loc]=-1;
    		for(i=1;i<=n;i++)
    		{
    			if(connect[loc][i]==1)
    				temp[i]--;
    		}
    	}
    	return re;
    }
    
    int main()
    {
    	int i;
    	char test[10];
    	while(scanf("%d%d",&n,&m)==2)
    	{
    		if(n+m==0)
    			break;
    
    		flag=0;
    		memset(indegree,0,sizeof(indegree));
    		memset(connect,0,sizeof(connect));
    		memset(queue,0,sizeof(queue));
    
    		for(i=1;i<=m;i++)
    		{
    			scanf("%s",test);
    
    			int x=test[0]-'A'+1;
    			int y=test[2]-'A'+1;
    
    			indegree[y]++;
    			connect[x][y]=1;
    
    			if(i==48)
    			{
    				i--;
    				i++;
    			}
    			int result;
    			if(flag==0)
    			{
    				result=solve();
    
    				if(result==-1)
    				{
    					flag=-1;
    					cout<<"Inconsistency found after "<<i<<" relations."<<endl;
    				}
    				else if(result==1)
    				{
    					flag=1;
    					cout<<"Sorted sequence determined after "<<i<<" relations: ";
    					int hk;
    					for(hk=1;hk<=n;hk++)
    					{
    						char temp=queue[hk]+'A'-1;
    						cout<<temp;
    					}
    					cout<<"."<<endl;
    				}
    			}
    		}
    		if(flag==0)
    		{
    			cout<<"Sorted sequence cannot be determined."<<endl;
    		}
    	}
    	return 0;
    }



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    关于ShareSDK接入的各种问题,以及解决方案
    Cocos2d-x使用iOS游戏内付费IAP(C++篇)
    数论——终结素数判定
    poj 2528 线段树+离散化
    STL 优先队列
    poj 2777 线段树+延迟更新
    RMQ
    codeforces 拼手速题2
    codeforces 拼手速题1
    子矩阵 思维吧
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4785806.html
Copyright © 2011-2022 走看看