#include<iostream>
#include<vector>
#include<stack>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN = 1001;
vector<int> g[MAXN];//adjlist
stack<int> S,P;
int belong[MAXN],vis[MAXN],indeg[MAXN],sccg[MAXN][MAXN],scccnt,disc[MAXN];
void init()
{
for(int i=0;i<MAXN;i++)g[i].clear();
memset(belong,-1,sizeof(belong));
memset(vis,0,sizeof(vis));
scccnt = 0;
memset(sccg,0,sizeof(sccg));
memset(indeg,0,sizeof(indeg));
while(!S.empty())S.pop();
while(!P.empty())P.pop();
}
void dfs_scc(int u,int &time)
{
disc[u] = time++;
S.push(u);
P.push(u);
vis[u] = 1;
for(int i=0;i<g[u].size();i++)
{
int v = g[u][i];
if(!vis[v])
{
dfs_scc(v,time);
}
else if(belong[v]==-1)
{
while(disc[P.top()]>disc[v])P.pop();
}
}
if(P.top()==u)
{
while(S.top()!=u)
{
int v = S.top();
belong[v] = scccnt;
S.pop();
}
S.pop();
belong[u] = scccnt;
P.pop();
scccnt++;
}
}
void Gabow(int n)
{
int time = 0;
for(int i=1;i<=n;i++)
{
if(!vis[i])dfs_scc(i,time);
}
}
void make_sccg(int n)
{
for(int i=1;i<=n;i++)
{
for(int j=0;j<g[i].size();j++)
{
if(belong[i]!=belong[g[i][j]])
{
sccg[belong[i]][belong[g[i][j]]]=1;
}
}
}
}
void cac_indeg()
{
for(int i=0;i<scccnt;i++)
{
for(int j=0;j<scccnt;j++)
{
if(sccg[j][i])indeg[i]++;
}
}
}
bool solve(int n)
{
Gabow(n);
make_sccg(n);
cac_indeg();
memset(vis,0,sizeof(vis));
for(int i=0;i<scccnt;i++)
{
int cnt=0,v;
for(int j=0;j<scccnt;j++)
{
if(indeg[j]==0&&!vis[j])v=j,cnt++;
}
if(cnt!=1)return false;
vis[v] = 1;
for(int w=0;w<scccnt;w++)
{
if(sccg[v][w])indeg[w]--;
}
}
return true;
}
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
g[a].push_back(b);
}
bool ok = solve(n);
if(ok) printf("Yes\n");
else printf("No\n");
}
return 0;
}
SCC_Gabow
最新推荐文章于 2020-07-24 11:37:42 发布