`
Coco_young
  • 浏览: 121297 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

SCC_Gabow

 
阅读更多
#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;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics