poj1094

来源:互联网 发布:linux trace 编辑:程序博客网 时间:2024/05/19 16:51

这个拓扑排序有一些特殊,在给出m个信息时,只要前r个信息已经足够判断的时候就要输出判断结果,但输入还要继续,这是Poj的风格了,不过判断时一定要小心优先级,要先判断是否有环,然后是否有唯一序列,最后才是不确定序列,这里我坑了太久,看了别人的提示才知道。拓扑排序做法就是按照找入度为0的点作为起始点进行排序,这里有bfs较为贴切。总归来说还是要细心,理解逻辑的先后顺序。

#include<cstdio>#include<cstdlib>#include<queue>#include<cstring>using namespace std;int n,m,g[30][30],inconsistency,determined,deg[30],in[30],vis[30];queue<int>q1,q2;void toposort(){    bool flag=0;    memset(vis,0,sizeof(vis));    while(!q1.empty())q1.pop();    while(!q2.empty())q2.pop();    for(int i=0; i<n; i++){       in[i]=deg[i];       if(in[i]==0)q1.push(i);    }    while(!q1.empty()){         if(q1.size()>1)flag=1;         int p=q1.front();         q2.push(p);         q1.pop();         for(int i=0; i<n; i++)if(g[p][i]){              if(--in[i]==0)q1.push(i);         }    }    if(!flag&&q2.size()==n)determined=1;    if(q2.size()!=n)inconsistency=1;    return ;}int main(){    char a,b,op;    while(scanf("%d %d",&n,&m)&&n!=0&&m!=0){        getchar();        inconsistency=0,determined=0;        memset(deg,0,sizeof(deg));        memset(g,0,sizeof(g));        for(int r=1; r<=m; r++){             scanf("%c%c%c",&a,&op,&b);             getchar();             if(!inconsistency&&!determined){//还没出结果                   if(g[b-'A'][a-'A']==1){                        printf("Inconsistency found after %d relations.\n",r);                        inconsistency=1;                   }                   else{                        deg[b-'A']++;                        g[a-'A'][b-'A']=1;                        toposort();                        if(inconsistency==1)printf("Inconsistency found after %d relations.\n",r);                        if(determined==1){                            printf("Sorted sequence determined after %d relations: ",r);                            while(!q2.empty()){                                 printf("%c",q2.front()+'A');                                 q2.pop();                            }                            printf(".\n");                        }                   }             }        }        if(!inconsistency&&!determined)printf("Sorted sequence cannot be determined.\n");    }    return 0;}


0 0
原创粉丝点击