一个板子题,其实理解确实是很重要的

题意:判断两张互相关联的有向图是否存在环,判断环,一开始我想用dfs,无奈太弱,打不出来,这里用拓扑排序,其实也是一个板子,理解当然更好了

输入:
2 (t组输入)
2 2 1 1 (分别代表图一的元素个数,图二的元素个数,图一的边,图二的边)
0 1
0 1
3 3 3 4
0 0
1 1
2 2
0 1
2 0
2 1
1 2

输出:
Case 1: Impossible
Case 2: Possible

拓扑排序解法
AC代码:

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
vector<int>vec[100005];
queue<int>q;
int indeg[100005];
int topsort(int x)//x为边数
{
while(!q.empty())
q.pop();
int num=0;
for(int i=0;i<x;i++)
{
if(!indeg[i])
{
q.push(i);
}
}
while(!q.empty())
{
int now=q.front();
q.pop();
num++;
for(int i=0;i<vec[now].size();i++)
{
int v=vec[now][i];
indeg[v]--;
if(!indeg[v])
q.push(v);
}
}
if(num==x)
return 0;//存在环
else
return 1;
}

int main()
{
int t,d=0;
scanf("%d",&t);
while(t--)
{
int e1,e2,p,r,u,v;
scanf("%d %d %d %d",&e1,&e2,&p,&r);
memset(indeg,0,sizeof(indeg));
while(p--)
{
scanf("%d %d",&u,&v);
vec[u].push_back(v+e1);
indeg[v+e1]++;
}
while(r--)
{
scanf("%d %d",&u,&v);
vec[u+e1].push_back(v);
indeg[v]++;
}

if(topsort(e1+e2))
printf("Case %d: Possible\n",++d);
else
printf("Case %d: Impossible\n",++d);
}

}