1146 Topological Order

题意:判断序列是否为拓扑序列。

思路:理解什么是拓扑排序就好了,简单题。ps.这是第一次考到拓扑序列,只是简单的让我们判断一下,我觉得9月8号会考如何求一个拓扑序列,外加求关键路径!?

代码:

#include <cstdio>
#include <vector>
using namespace std;
const int maxn=1005;
vector<int> adj[maxn];

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    vector<int> indegree(n+1),temp;
    int u,v;
    for(int i=0;i<m;i++){
        scanf("%d%d",&u,&v);
        adj[u].push_back(v);
        indegree[v]++;
    }
    int query;
    scanf("%d",&query);
    vector<int> ans;
    for(int i=0;i<query;i++){
        bool flag=true;
        temp=indegree;//初始化,注意每一轮判断前都先赋值,因为每一轮都会改动结点的入度
        for(int j=0;j<n;j++){
            scanf("%d",&u);
            if(temp[u]==0 && flag){
                //遍历结点u的所有出边,把相应的结点入度减1
                for(int k=0;k<adj[u].size();k++)
                    temp[adj[u][k]]--;
            }else{
                flag=false;
            }
        }
        if(flag==false) ans.push_back(i);
    }
    for(int i=0;i<ans.size();i++){
        printf("%d",ans[i]);
        if(i<ans.size()-1) printf(" ");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/kkmjy/p/9567968.html