zoukankan      html  css  js  c++  java
  • 排序(拓扑好题)

    ------------恢复内容开始------------

    题面:https://www.luogu.com.cn/problem/P1347


    明确题目中三种结果的关系。

    对于每一个输入的条件,我们都进行拓扑。

    Ⅰ如果发现本次拓扑进入队列的点不是所有的点 ,说明有环,那么后续无论如何都是不能确定大小关系的,直接输出

    Ⅱ如果单次有两个入度为0的点压入队列,那我们是不能确定大小关系的

    Ⅳ不满足以上条件且所有的点都进入了队列,那说明可行

    #include <bits/stdc++.h>
    using namespace std;
    int n,m,vis[39],indug[39],t[39];
    string a[30009];
    vector<int>vec[39];
    string s;
    int tuopu(int k)
    {
        queue<int>q;
        int up=0,f=0,num=0;
        for(int i=1;i<=n;i++)
        {
            if(vis[i]&&!t[i])//字母出现过
            {
                f++;num++;s+=char(i+'A'-1);
                q.push(i);
                if(f>1)    up=1;//无法判断    
            } 
        }
        while(!q.empty())
        {
            int now=q.front();q.pop();
            int f=0;//同理,如过一次出现2个点,无法判断 
            for(int i=0;i<vec[now].size();i++)
            {
                int w=vec[now][i];
                if(--t[w]==0)
                {
                    f++;
                    if(f>1)        up=1;//无法判断关系 
                    s+=char(w+'A'-1);
                    num++;
                    q.push(w);
                }
            }
        }
        if(num!=k)    return -1;//出现环
        if(up)    return 100;//无法判断 
        if(num==n)    return 1;//成功 
    }
    int main()
    {
            cin>>n>>m;
            for(int i=0;i<=26;i++)    vec[i].clear();
            memset(vis,0,sizeof(vis));
            memset(indug,0,sizeof(indug));
            for(int i=1;i<=m;i++)    cin>>a[i];
            int i,k=0,ok=-1;//出现的字母数 
            string ans;s="";
            for(i=1;i<=m;i++)
            {
                s="";//每次tuopu构造的字符串 
                int l=a[i][0]-'A'+1,r=a[i][2]-'A'+1;
                vec[l].push_back(r);indug[r]++;
                for(int j=0;j<=26;j++)    t[j]=indug[j];//供tuopu使用 
                if(vis[l]==0)    k++;
                if(vis[r]==0)    k++;//统计目前有多少字符 
                vis[l]=vis[r]=1;
                int z=tuopu(k); 
                if(z==-1)    break;//有环 
                if(z==1)//成功 
                {
                    ans=s,ok=i;
                    break;
                }
            }
            if(i!=m+1&&ok==-1)//有环形,矛盾
                cout<<"Inconsistency found after "<<i<<" relations."<<endl; 
            else if(ok!=-1)//成功 
                cout<<"Sorted sequence determined after "<<ok<<" relations: "<<ans<<"."<<endl;
            else
                cout<<"Sorted sequence cannot be determined."<<endl;    
    }

     

    ------------恢复内容结束------------

  • 相关阅读:
    对于未来的搜索引擎的思考!
    [转]《C陷阱与缺陷》读书笔记——前车之覆,后车之鉴
    C语言深度解剖笔记
    感觉压力挺大的!!
    发现中国的代理服务器很少
    我的博客搬家了
    [转]22+1条经典的编程引言
    [转]想象五年之后的你
    什么叫做卷积
    《30天自制操作系统》读书笔记(1)读前感
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12503302.html
Copyright © 2011-2022 走看看