排序

题目链接:https://www.luogu.com.cn/problem/P1347

题意:

对于n个变量A,B,C..

给定m个类似A<B的关系,判断满足这些变量之间什么关系

1.是否出现逻辑矛盾,(A<B,B<C,C<A)

2.是否能够判断出所有变量之间的大小关系

思路:

拓补排序问题

对于每一个A<B关系,我们建立一个由A指向B的有向边

那么逻辑矛盾等价于出现

无法判断所有变量关系的情况有:1.关系模糊(A<B,A<C,B<D,C<D:B与C等价)2.有变量还没有给出关系

int n,m;
vector<int>e[maxn];
vector<int>tp;
int din[26];
int din_cy[26];
int md=1;
set<int>st;
int toposort(){
    queue<int>q;
    for(int i=0;i<n;i++)if(din[i]==0&&st.count(i)){
        q.push(i);
        tp.pb(i);
    }
    for(int i=0;i<n;i++)din_cy[i]=din[i];
    int flag=1;
    while(q.size()){
        if(q.size()>=2)flag=0;//没法判断
        int now=q.front();q.pop();
        for(int i=0;i<e[now].size();i++){
            int v=e[now][i];din_cy[v]--;
            if(din_cy[v]==0){
                q.push(v);
                tp.pb(v);
            }
        }
    }

    for(int i=0;i<n;i++){
        if(st.count(i)&&din_cy[i]){
            md=0;return -1;//环
        }
    }

    if(!flag)return 0;
    if(tp.size()==n){
        return 1;//可以
    }else return 0;//没法判断
}
void solve(){
    cin>>n>>m;
    int ok=1;
    for(int k=1;k<=m;k++){
        string s;cin>>s;
        int u=s[0]-'A';
        int v=s[2]-'A';
        e[u].pb(v);
        din[v]++;
        st.insert(u);st.insert(v);
        tp.clear();
        int res=toposort();

        if(res==-1){
                cout<<"Inconsistency found after "<<k<<" relations.";return;
        }else if(res==1){
            cout<<"Sorted sequence determined after "<<k<<" relations: ";
            for(int j=0;j<tp.size();j++){
                cout<<(char)(tp[j]+'A');
            }
            cout<<'.';return;
        }
    }

    cout<<"Sorted sequence cannot be determined."<<endl;
}
posted @ 2025-04-22 20:30  Marinaco  阅读(11)  评论(0)    收藏  举报
//雪花飘落效果