Sorting It All Out POJ - 1094 拓扑排序

题意:给N个字母,和M个偏序关系 求一个可确定的全序,可确定是指没有其他的可能例如A>B D>B 那么有ADB DAB两种,这就是不可确定的
其中,M个偏序关系可以看做是一个一个按时间给出的,如果还没给完就已经满足条件了,后面的可以不用管

题解:拓扑水题,直接用拓扑排序暴力 其中 如果途中 冲突 那么即使后面添加了也不能改变冲突 如果前面成功了那就不用管后面了直接continue 其中
拓扑判断的时候如果存在多个0度点 那么就不可确定 如果排序完比n个点少,那么确定不了一个全序,分类讨论

 

#include<cstdio>
#include<iostream>
using namespace std;
int seq[50];
int n,m;
int err,ans;
struct Node{
int pos,next;
}edge[5000];
int neigh[500];
int queue[50000];
int cur,indegree[50];
int front=0,rear=0;
int toposort(){
int indge[50];
bool ok=0;
for(int i=0;i<n;i++){
indge[i]=indegree[i];
if(indge[i]==0)queue[rear++]=i;
}
int k=0;
while(front!=rear){
if(front+1<rear)ok=1;
int temp=queue[front++];
seq[k++]=temp;
int e=neigh[temp];
while(e!=-1){
  --indge[edge[e].pos];
  if(indge[edge[e].pos]==0)queue[rear++]=edge[e].pos;
  e=edge[e].next;
}

}
if(k<n)return -1;//huan
if(ok)return 0;//chongfu
return 1;//chenggong
}
int main(){
    char s[50];
    while(cin>>n>>m&&n){
        for(int i=0;i<n;i++){
           indegree[i]=0;
          neigh[i]=-1;
        }
        cur=0;
        err=ans=-1;
        for(int i=0;i<m;i++){
        cin>>s;
        if(err!=-1||ans!=-1)continue;//已经有结果了直接把后面的直接读掉就行
        int temp1=s[0]-'A',temp2=s[2]-'A';
        edge[cur].pos=temp2;
        edge[cur].next=neigh[temp1];//链表记录表相邻
        neigh[temp1]=cur;
        cur++;
        indegree[temp2]++;
        int res=toposort();
        if(res==1)ans=i+1;
        else if(res==-1)err=i+1;
        }
        if(ans!=-1){
                    printf("Sorted sequence determined after %d relations: ", ans);
            for (int i = 0; i < n; ++i) putchar('A' + seq[i]);
            printf(".\n");
        
        }
        else if(err!=-1){
                       printf("Inconsistency found after %d relations.\n", err);
        }
        else {
                        printf("Sorted sequence cannot be determined.\n");
        
        }
        
    
    }
return 0;
}

 

posted @ 2018-11-21 14:59  tttttttttrx  阅读(104)  评论(0编辑  收藏  举报