PAT

B1146 Topological Order (拓扑排序)

2020-01-29  本文已影响0人  Tsukinousag

B1146 Topological Order (25分)

不用完全模拟拓扑排序,备份入度记录数组,对序列的每个数字判断入度是否为0,若不是0则判断该序列不是拓扑序列,若是0,对该数字出边所能到达的数字的入度减减,重复以上操作。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#define lowbit(i)((i)&(-i))
using namespace std;
typedef long long ll;
const int MAX=10010;
const int INF=0x3f3f3f3f;
const int MOD=1000000007;
const int SQR=633;
int n,m,k;
vector<int>G[MAX];
vector<int>vt;
vector<int>res;
bool topologicalsort(int temp[])
{
   int flag=1;
   queue<int>q;
   for(int i=0;i<vt.size();i++)
   {
       if(temp[vt[i]]==0)
       {
           for(int j=0;j<G[vt[i]].size();j++)
           {
               temp[G[vt[i]][j]]--;
           }
       }
       else
        flag=0;
   }
   if(flag==0)
    return false;
   else
    return true;
}
int main()
{
    int indegree[MAX];
    int ans[MAX];
    memset(indegree,0,sizeof(indegree));
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        G[x].push_back(y);
        indegree[y]++;
    }
    scanf("%d",&k);
    for(int i=0;i<k;i++)
    {
        vt.clear();
        for(int i=0;i<n;i++)
        {
            int t;
            scanf("%d",&t);
            vt.push_back(t);
        }
        for(int i=1;i<=n;i++)
            ans[i]=indegree[i];
        if(!topologicalsort(ans))
            res.push_back(i);
    }
    for(int i=0;i<res.size();i++)
    {
        if(i==0)
            printf("%d",res[i]);
        else
            printf(" %d",res[i]);
    }
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读