76分求助!!!大佬帮看看吧
查看原帖
76分求助!!!大佬帮看看吧
475143
gaojian2007楼主2022/11/16 09:56
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
int n,m;
int tim,vis[10005],cnt,scc[10005],sd[10005],head[10005],net[100005],to[100005],from[100005],ru[100005],dp[100005],tot,dfn[10005],low[10005];
int ans;
stack<int>s;
vector<int>a[10005];
queue<int>q;
void add(int u,int v)
{
	net[++tot]=head[u];
	head[u]=tot;
	to[tot]=v;
	from[tot]=u;
}
void tarjan(int x)
{
	dfn[x]=low[x]=++tim;
	s.push(x);
	vis[x]=1;
	for(int i=head[x];i;i=net[i])
	{
		if(!dfn[to[i]])
		{
			tarjan(to[i]);
			low[x]=min(low[x],low[to[i]]);
		}
		else
		{
			if(vis[to[i]]==1)
			{
				low[x]=min(dfn[to[i]],low[x]);
			}
		}
	}
	if(dfn[x]==low[x])
	{
		cnt++;
		int y;
		do
		{
			y=s.top();
			s.pop();
			vis[y]=0;
			scc[y]=cnt;
			sd[cnt]++;
		}while(x!=y);
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])
		tarjan(i);
	}
	for(int i=1;i<=tot;i++)
	{
		int x=scc[from[i]],y=scc[to[i]];
		if(x!=y)
		{
			ru[y]++;
			a[x].push_back(y);
		}
	}
	for(int i=1;i<=cnt;i++)
	{
		if(ru[i]==0)
		{
			q.push(i);
			dp[i]=sd[i];
		}
	}
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<a[u].size();i++)
		{
			dp[a[u][i]]=max(dp[a[u][i]],dp[u]+sd[a[u][i]]);
			ru[a[u][i]]--;
			if(ru[a[u][i]]==0)
			{
				q.push(a[u][i]);
			}
		}
	}
	for(int i=1;i<=cnt;i++)
	{
		if(dp[i]==n)
		ans+=sd[i];
	}
	printf("%d",ans);
	return 0;
} 
2022/11/16 09:56
加载中...