题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805343043829760
题意
判断给定序列是否为拓扑序列
题解
用map<int,vector>存储每个数字指向的数字集合,同时使map<int,int>记录每个数字的入度(被指的次数)
在判断给定序列时,如果数字的入度为0,说明没有数字指向它,符合要求,同时将该数字指向的数字的入度减一,否则不符合要求。将不符合要求的序列下标存入ans中并在最后按要求输出即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,k,t;
scanf("%d %d",&n,&m);
map<int,vector<int>> f;
map<int,int> cnt,cnt1;
vector<int> ans;
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
f[x].push_back(y);
cnt[y]++,cnt1[y]++;
}
scanf("%d",&k);
for(int i=0;i<k;i++)
{
int a[n];
cnt=cnt1; //这步必须有,每次循环都要初始化cnt
for(int j=0;j<n;j++) scanf("%d",&a[j]);
for(int j=0;j<n;j++)
{
if(cnt[a[j]]==0)
for(int it:f[a[j]]) cnt[it]--;
else
{
ans.push_back(i);
break;
}
}
}
for(int i=0;i<ans.size();i++)
printf("%s%d",i==0?"":" ",ans[i]);
}