给一个n结点m条边的有向图D,可以这样构造图E:给D的每条边u->v,在E中建立一个点uv,然后对于D中的两条边u->v和v->w,在E中从uv向vw连一条有向边。E中不含有其他点和边。
输入E,你的任务是判断是否存在相应的D。注意,D可以有重边和自环。
#include<bits/stdc++.h>
using namespace std;
#define clr(a,b) memset(a,b,sizeof a)
typedef long long ll;
const int base=310;
int T,m,k,u,v,mp[310][310];
bool solve()
{
for(int i=1;i<=m;++i)
{
for(int j=i+1;j<=m;++j)
{
int f1=0,f2=0;
for(int k=1;k<=m;++k)
{
if(mp[i][k]&&mp[j][k]) f1=1;
if(mp[i][k]^mp[j][k]) f2=1;
if(f1&&f2) return false;
}
}
}
return true;
}
int main()
{
scanf("%d",&T);
while(T--)
{
clr(mp,0);
scanf("%d%d",&m,&k);
for(int i=1;i<=k;++i)
{
scanf("%d%d",&u,&v);
mp[++u][++v]=1;
}
if(solve()) printf("Yes\n");
else printf("No\n");
}
return 0;
}
原文:https://www.cnblogs.com/songorz/p/9937453.html