zoukankan      html  css  js  c++  java
  • <luogu1347>排序

    本来打算当打了个拓扑的板子

    后来发现并不只是个板子

    差不多 管他呢

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<queue>
    #include<algorithm>
    #define rint register int
    using std::queue;
    using std::cout;
    using std::endl;
    template <class T> inline void read(T &X)
    {
        X=0;int W=0;char ch=0;
        while(!isdigit(ch))W|=ch=='-',ch=getchar();
        while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
        X=W?-X:X;return;
    }
    int n,m,head[30],CNT=0,in[30],IN[30],cnt=0,Cnt=0,vis[30],ans[30];
    struct node{int to,next;}edge[50];
    queue<int> q;
    void add(int u,int v)
    {
        ++in[v];
        edge[++Cnt].to=v;
        edge[Cnt].next=head[u]; 
        head[u]=Cnt;
    }
    
    int tp()
    {
        int pd=0,pd2=0;cnt=0;
        for(rint i=1;i<=26;++i)
        {
            IN[i]=in[i];
            if(!IN[i] && vis[i])
            {
                if(!pd)pd=1;
                else pd2=1;
                q.push(i);
                ans[++cnt]=i;
            }
        }
        if(q.empty())return 1;
        while(!q.empty())
        {
            int u=q.front();q.pop();pd=0;
            for(rint i=head[u];i;i=edge[i].next)
            {
                --IN[edge[i].to];
                
                if(!IN[edge[i].to])
                {
                    if(!pd)pd=1;
                     else pd2=1;
                    q.push(edge[i].to);
                    ans[++cnt]=edge[i].to;
                }
            }
        }
        if(cnt!=CNT)return 1;
        if(pd2)return 2;
        return 0;
    }
    int main()
    {
        read(n),read(m);
        for(rint i=1;i<=m;++i)
        {
            char a[5];
            scanf("%s",a); 
            int u=a[0]-64,v=a[2]-64;
            add(u,v);
            if(!vis[u])vis[u]=1,CNT++;
            if(!vis[v])vis[v]=1,CNT++;
            int tps=tp();
            if(tps==1)
            {
                printf("Inconsistency found after %d relations.",i);
                return 0;
            }
            if(cnt==n && !tps)
            {
                printf("Sorted sequence determined after %d relations: ",i);
                for(rint j=1;j<=cnt;++j)printf("%c",ans[j]+64);
                printf(".") ;
                return 0;
            }
        }
        printf("Sorted sequence cannot be determined.");
    return 0;
    }
  • 相关阅读:
    Linux并发与同步专题 (1)原子操作和内存屏障
    Linux并发与同步专题
    功耗案例分析:周期性底电流抬高问题分析和解决
    Android OpenGL 基础入门
    使用Codeblock搭建Windows下Objec-c学习环境
    Muduo 多线程模型对比
    NPTL 线程同步方式
    C++ 封装互斥对象
    Java 常用字符串操作总结
    Android 开发有用代码积累
  • 原文地址:https://www.cnblogs.com/pile8852/p/9921243.html
Copyright © 2011-2022 走看看