PAT (Advanced Level) Practice - 1146 Topological Order(25 分)

版权声明: https://blog.csdn.net/Dream_Weave/article/details/82023316

题目链接:点击打开链接

题目大意:判断以下序列是否符合拓扑排序定义,若不符合,输出第 i-th 的序列对应的 i。

解题思路:模拟 Topo 排序。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007

using namespace std;

typedef long long ll;

const int NV=1e3+10;

int n;
int in[NV], tin[NV];
int mp[NV][NV];
set<int> st;

void init()
{
    st.clear();
    for(int i=1;i<=n;i++)
    {
        tin[i]=in[i];
        if(in[i]==0)
        {
            st.insert(i);
        }
    }
}

int main()
{
    int m,q,a,u,v,first=1;
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&u,&v);
        if(!mp[u][v])
        {
            mp[u][v]=1;
            in[v]++;
        }
    }

    scanf("%d",&q);
    for(int i=0;i<q;i++)
    {
        int f=1;
        init();
        for(int j=0;j<n;j++)
        {
            scanf("%d",&a);
            auto it=st.find(a);
            if(it!=st.end())
            {
                st.erase(it);
                for(int k=1;k<=n;k++)
                {
                    if(mp[a][k]==1)
                    {
                        tin[k]--;
                        if(tin[k]==0) st.insert(k);
                    }
                }
            }
            else f=0;
        }
        if(!f)
            if(first) first=0, printf("%d",i);
            else printf(" %d",i);
    }
    puts("");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/Dream_Weave/article/details/82023316