[POJ1094] Sorting It All Out

link

题目大意

给出$m$个不等式关系,问可以从第几个开始确定所有之间的大小关系。若无解请输出是无法确定还是与已知矛盾。

试题分析

这题是真的是坑啊,尽然放在$floyd$传到闭包上面,还用二分,是真的强啊。

其实一下子就会知道其实这是一道拓扑排序的题,所以当我们每次输入问一条边时,我们就去拓扑判断是否会形成环,条件是否充足,与顺序,然后就记得分类讨论即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
inline int read(){
    int f=1,ans=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    return f*ans;
}
queue<int> que;
int n,m,in[27],d[27][27],find1,k[27];
char out[27];
char str[1001];
int topu(){
    while(!que.empty()) que.pop();
    for(int i=1;i<=27;i++) k[i]=in[i];
    for(int i=1;i<=n;i++){if(!in[i]) que.push(i);}
    int sx=0,num=0;
    while(!que.empty()){
        if(que.size()>1) sx=1;
        int xx=que.front();que.pop();
        out[++num]=xx+'A'-1;
        for(int i=1;i<=26;i++){
            if(d[xx][i]){
                k[i]--;
                if(k[i]==0) que.push(i);
            }
        }
    }
    if(num!=n) return 1;
    if(sx==1) return -1;
    return 0;
}
int query,step;
int main(){
//    freopen("7.in","r",stdin);
    while(1){
        memset(in,0,sizeof(in)),find1=0,query=0,step=0;
        memset(d,0,sizeof(d));
        n=read(),m=read();
        if(!n&&!m) return 0;
        for(int i=1;i<=m;i++){
            cin>>(str+1);
            int u=str[1]-'A'+1,v=str[3]-'A'+1;
            if(str[2]=='>') swap(u,v);
            if(find1||query) continue;
            if(d[v][u]){find1=1;printf("Inconsistency found after %d relations.",i);continue;}
            if(!d[u][v]){
                d[u][v]=1;
                in[v]++;
            }
            int pd=topu();
            if(pd==0){query=1;step=i;continue;}
            if(pd==1){printf("Inconsistency found after %d relations.",i);find1=1;continue;}
        }
        if(query&&find1==0){
            printf("Sorted sequence determined after %d relations: ",step);
            for(int i=1;i<=n;i++) cout<<out[i];
            printf(".");
        }
        if(find1==0&&query==0) printf("Sorted sequence cannot be determined.");
        printf("
");
    }
}
View Code
原文地址:https://www.cnblogs.com/si-rui-yang/p/10159519.html