POJ 1094 Sorting It All Out (拓扑排序)

题意:给你一些大写字母间的偏序关系,然后让你判断能否唯一确定它们之间的关系,或者所给关系是矛盾的,或者到最后也不能确定它们之间的关系。   由DAG图节点的偏序关系确定节点的排序可以由拓扑排序求出。而确定这些问题也可以由拓扑排序完成。 我们知道拓扑排序的过程是: 1.每次从队列中找出1个入度为0的点作为当前排序的点(加入到已排序的集合中) 2.从图中删除以这个点为起点的弧(即使所有的终点入度减1) 3.如果找不到入度为0的点则退出过程   那么我们来看拓扑排序的过程中怎么判断这几个问题: 1.如果某次找入度为0的点时有多个入度为0的点,则无法确定关系; 2.如果找不到入度为0的点退出过程,但是并不是所有的点都已经确定排序,则图中一定有环,即关系是矛盾的。   题目还隐形地要求判断矛盾在无法确定关系之前,所以我笨拙地用了两次拓扑排序,第一次确定是否矛盾,第二次再判断能否确定关系。  
#include 
 
   
    
  
#include 
  
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
            #include 
            
              #include 
             
               #include 
              
                #define MID(x,y) ((x+y)>>1) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int MAXE = 2000; const int MAXV = 30; struct node{ int u, v; int next; }arc[MAXE]; int cnt, head[MAXV], ind[MAXV]; void init(){ cnt = 0; mem(head, -1); mem(ind, 0); return ; } void add(int u, int v){ arc[cnt].u = u; arc[cnt].v = v; arc[cnt].next = head[u]; head[u] = cnt ++; return ; } bool vis[MAXV]; vector 
               
                 tsort; vector 
                
                  tmp; queue 
                 
                   Q; void topsort1(int n){ tmp.clear(); while(!Q.empty()){ Q.pop(); } mem(ind, 0); mem(vis, 0); for(int i = 0; i < cnt; i ++){ ind[arc[i].v] ++; } int num = 0; for (int i = 0; i < n; i ++){ if (ind[i] == 0){ num ++; Q.push(i); vis[i] = 1; } } while(!Q.empty()){ int u = Q.front(); Q.pop(); tmp.push_back(u); for (int i = head[u]; i != -1; i = arc[i].next){ int v = arc[i].v; if (!vis[v]){ ind[v] --; if (ind[v] == 0){ Q.push(v); vis[v] = 1; } } } } return ; } bool topsort(int n){ tsort.clear(); while(!Q.empty()){ Q.pop(); } mem(ind, 0); mem(vis, 0); for(int i = 0; i < cnt; i ++){ ind[arc[i].v] ++; } int num = 0; for (int i = 0; i < n; i ++){ if (ind[i] == 0){ if (num > 0){ return false; } else{ num ++; Q.push(i); vis[i] = 1; } } } while(!Q.empty()){ if (Q.size() > 1) return false; int u = Q.front(); Q.pop(); tsort.push_back(u); for (int i = head[u]; i != -1; i = arc[i].next){ int v = arc[i].v; if (!vis[v]){ ind[v] --; if (ind[v] == 0){ Q.push(v); vis[v] = 1; } } } } return true; } int n, m; int main(){ //freopen("B.1.dat","r+",stdin); //freopen("B.1.out","w+",stdout); while(scanf("%d %d", &n, &m)){ if (n + m == 0) break; init(); int ok = 0; int i; char s[4]; for (i = 1; i <= m; i ++){ scanf("%s", s); add(s[0]-65, s[2]-65); topsort1(n); if ((int)tmp.size() < n){ printf("Inconsistency found after %d relations.\n", i); ok = 1; break; } if (topsort(n)){ ok = 1; printf("Sorted sequence determined after %d relations: ", i); for (int j = 0; j < (int)tsort.size(); j ++){ printf("%c", tsort[j]+65); } puts("."); break; } } for (i ++;i <= m; i ++){ scanf("%s", s); } if (ok == 0){ puts("Sorted sequence cannot be determined."); } } return 0; } 
                  
                 
                
               
              
             
           
          
         
        
       
      
    
 
   
 

你可能感兴趣的:(sort)