AcWing 1639. 拓扑顺序
原题链接
简单
C++ 代码
#include<iostream>
#include<cstring>
using namespace std;
const int N=1010,M=10010;
int n,m;//定义顶点数和边数
struct Edge
{
int a,b;
}e[M];//定义结构体边
int p[N];//定义验证顶点序列的数组
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)cin>>e[i].a>>e[i].b;
int k;
cin>>k;//输入询问数
bool first=true;//定义是否是第一个控制空格
for(int i=0;i<k;i++)//对询问数进行遍历
{
for(int j=1;j<=n;j++)//按顶点输入
{
int x;
cin>>x;
p[x]=j;//将当前询问的顶点下标依次输入对应顶点值作为下标的数组值
}
bool success=true;//判断是否是拓扑排序
for(int j=0;j<m;j++)//按边遍历
{
if(p[e[j].a]>p[e[j].b])
{
success=false;
break;
}
}
if(!success)//没成功的话输出执行不了的询问数
{
if(first)first=false;//输出空格前看看是否是第一个,是第一个的话不输出空格并且改first标记为false
else cout<<' ';//不是第一个就输出空格
cout<<i;//输出不符合的询问
}
}
return 0;
}