c_pat_拓扑序列(减入度+注意输入坑)

第一行包含两个整数 N 和 M,分别表示有向图的点和边的数量。
接下来 M 行,每行给出一条边的起点和终点。
点的编号从 1 到 N。
再一行包含一个整数 K,表示询问次数。
接下来 K 行,每行包含一个所有点的排列。
一行中的数字用空格隔开。
输出格式
在一行中输出所有不是拓扑序列的询问序列的编号。

#include<bits/stdc++.h>
using namespace std;
const int N=1005, K=105;
vector<int> g[N];
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n,m; cin>>n>>m;
    vector<int> in(n+5,0);
    for (int i=0; i<m; i++) {
        int u,v; cin>>u>>v;
        g[u].push_back(v);
        in[v]++;
    }
    int k, is_firstTime=true; cin>>k;
    for (int i=0; i<k; i++) {
        bool is_topo=true;
        vector<int> in1(in);
        for (int j=0; j<n; j++) {
            int u; cin>>u;
            if (in1[u]!=0) {
                is_topo=false;      //不能提前break啊,还要输入数据...
            }
            for (int v : g[u]) in1[v]--;
        }
        if (!is_topo) {
            if (is_firstTime) cout<<i, is_firstTime=false;
            else              cout<<' '<<i;
        }
    }
    return 0;
}
posted @ 2020-09-19 20:39  童年の波鞋  阅读(162)  评论(0编辑  收藏  举报