Poj 1094 拓扑排序

题意: 还是字母比大小 然后判断是否有回路,在第几个信息之后可以确定拓扑次序 或者否定拓扑次序的存在 


这题的题目是错的 因为在确定了一个拓扑序之后还可能出现破坏信息

但是如果这样判断 那么代码就会写错 

因此我们只能将错就错  在确定拓扑序列之后 跳出或者忽略之后的信息就可以拿到Ac--呵呵呵呵呵

#include<queue>
#include<stdio.h>
#include<iostream>
using namespace std;
#define maxn 111
char op[111];
int head[maxn],cnt,vis[maxn],in[maxn],tmp[maxn],id[maxn],tmpvis[maxn];
struct edge{
    int u,v,next;
}e[maxn*10];
void init(){
    memset(head,-1,sizeof head);
    memset(vis,0,sizeof vis);
    memset(id,-1,sizeof id);
    memset(in,0,sizeof in);
    cnt=0;
}
void add(int u,int v){
    e[cnt].u=u;e[cnt].v=v;
    e[cnt].next=head[u];
    head[u]=cnt++;
}
int main(){
    int n,m;
    
    while(~scanf("%d%d",&n,&m)){
        if(n==0&&m==0)break;
        init();
        int fl=0,fl1=0;
        priority_queue<int>q;

        for(int i=0;i<m;++i){
            scanf("%s",op);

            if(fl||fl1)continue;
            add(op[0]-'A',op[2]-'A');
            vis[op[0]-'A']=vis[op[2]-'A']=1;
            
            in[op[2]-'A']++;
            for(int j=0;j<26;++j)tmp[j]=in[j];
            for(int j=0;j<26;++j)
                if(vis[j]&&in[j]==0){
                    q.push(j);
                }
            for(int i=0;i<26;++i)tmpvis[i]=vis[i];
            while(!q.empty()){
                int cur=q.top();q.pop();
                for(int j=head[cur];j!=-1;j=e[j].next){
                    int v=e[j].v;
                    tmp[v]--;
                    tmpvis[v]=max(tmpvis[v],tmpvis[cur]+1);
                    if(tmp[v]==0)q.push(v);
                }
            }
            
            for(int j=0;j<26;++j){
                if(tmp[j]!=0)
                       fl=i+1;
            }
            
            if(!fl&&!fl1){
                for(int i=0;i<26;++i)
                    if(tmpvis[i])
                        id[tmpvis[i]]=i;
                int all=0;
                for(int i=1;i<=n;++i){
                    if(id[i]==-1){all=1;break;}
                }
                if(all){memset(id,-1,sizeof id);}
                else fl1=i+1;
            }
            
        }
        if(fl)printf("Inconsistency found after %d relations.\n",fl);
        else if(!fl1)printf("Sorted sequence cannot be determined.\n");
        else{
            printf("Sorted sequence determined after %d relations: ",fl1);
            for(int i=1;i<=n;++i)printf("%c",'A'+id[i]);
            printf(".\n");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值