96分求助 (Kosaraju)
查看原帖
96分求助 (Kosaraju)
227728
冰糖鸽子TJ鸽子协会楼主2020/11/24 13:54

RT,没用Tarjan,用的Kosaraju

错的第13个点96什么的就很抑郁

PS:有的数组或变量没有用到,因为直接按缩点模板改的

#include <bits/stdc++.h>
using namespace std;
int n,m,u,v,val,x,siz[100005],res[100005],ans,out[100005],bh[100005],fromp[100005],cnt,zz,vis[100005];
vector<int>road[100005];
bool flag[100005];
vector<int>road2[100005];
vector<int>newp[100005];
map<int,int>isa[100005];
map<int,int>isb;
void dfs_A(int x)
{
	if(vis[x]){return;}
	vis[x]=1;
	for(int i=0;i<road[x].size();i++)
	{
		dfs_A(road[x][i]);
	}
	cnt++;
	bh[cnt]=x;
}
void dfs_B(int x)
{
	if(vis[x]){return;}
	vis[x]=1;
	// cout<<x<<' '<<cnt<<' ';
	newp[cnt].push_back(x);
	fromp[x]=cnt;
	siz[cnt]++;
	for(int i=0;i<road2[x].size();i++)
	{
		dfs_B(road2[x][i]);
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		if(isb[u*1000000+v])
		{
			continue;
		}
		isb[u*1000000+v]=1;
		road[u].push_back(v);
		road2[v].push_back(u);
	}
	dfs_A(1);
	zz=cnt;
	cnt=0;
	for(int i=1;i<=n;i++)
	{
		if(vis[i]==0)
		{
			cnt++;
			flag[i]=1;
			siz[cnt]=1;
			newp[cnt].push_back(i);
			fromp[i]=cnt;
		}
	}
	for(int i=1;i<=n;i++)
	{
		vis[i]=flag[i];
	}
	while(zz>0)
	{
		cnt++;
		dfs_B(bh[zz]);
		while(zz>0&&vis[bh[zz]])
		{
			zz--;
		}
	}
	for(int i=1;i<=cnt;i++)
	{
		for(int j=0;j<newp[i].size();j++)
		{
			for(int k=0;k<road[newp[i][j]].size();k++)
			{
				if(fromp[road[newp[i][j]][k]]==i)
				{
					continue;
				}
				if(isa[i][fromp[road[newp[i][j]][k]]])
				{
					continue;
				}
				out[i]++;
				isa[i][fromp[road[newp[i][j]][k]]]=1;
				// cout<<"C"<<endl<<i<<' '<<fromp[road[newp[i][j]][k]]<<endl;
			}
		}
	}
	int flaged=0;
	for(int i=1;i<=cnt;i++)
	{
		if(out[i]==0)
		{
			if(flaged){cout<<0<<endl;return 0;}
			flaged=i;
		}
	}
	cout<<siz[flaged];
	return 0;
}


/*
调试 step(1) 加载中...

对应

1=2
2=14
3=17
4=28
5=38
6=21
7=3
8=26

1->2√
3->17√
2->14√
4->45√
8->71√
5->83√

*/



2020/11/24 13:54
加载中...