邻接矩阵调不对了
查看原帖
邻接矩阵调不对了
70674
hfyzyhlez楼主2022/10/19 17:09

如题,题解里都是邻接表不太好对照

#include<bits/stdc++.h>
using namespace std;
#define N 1000010
#define ll long long
vector<ll> g[N],gnew[N];//gnew存缩点后新建的图
ll color[N],vis[N],dfn[N],st[N],low[N],p[N],f[N],S[N];//color存tarjan后的点
ll num[N],index[N];//index入度
ll ix,top,sum,res=0,n,m,ans,tot;
void tarjan(ll v)
{
	dfn[v]=++ix;
	low[v]=ix;
	vis[v]=1;
	st[++top]=v;
	for(ll i=0;i<g[v].size();++i)
	{
		ll id=g[v][i];
		if(!dfn[id])
		{
			tarjan(id);
			low[v]=min(low[v],low[id]);
		}
		else
		{
			if(vis[id])
			{
				low[v]=min(low[v],low[id]);
			}
		}
	}
	if(low[v]==dfn[v])
	{
		color[v]=++sum;num[sum]+=p[v];
		vis[v]=0;
		while(st[top]!=v)
		{
			color[st[top]]=sum;
			vis[st[top--]]=0;
			num[sum]+=p[st[top]]; 
		}
		top--;
	}
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;++i)
	{
		scanf("%lld",&p[i]);
	}
	for(int i=1;i<=m;++i)
	{
		ll x,y;
		scanf("%lld%lld",&x,&y);
		g[x].push_back(y);
	}
	for(ll i=1;i<=n;++i)
		if(!dfn[i])
			tarjan(i);
	for(int i=1;i<=n;++i)
	{
		for(ll k=0;k<g[i].size();++k)
		{
			ll v=g[i][k];
			if(color[v]!=color[i])
			{
				gnew[i].push_back(color[k]);
				index[color[k]]++;
			}
		}
	}
	for(int i=1;i<=sum;++i)
	{
		if(!index[i])
		{
			S[++tot]=i;
			f[i]=num[i];
		}
	}
	while(tot)
	{
		int x=S[tot--];
		for(int i=0;i<gnew[x].size();++i)
		{
			int y=gnew[x][i];
			f[y]=max(f[y],f[x]+num[y]);
			if(--index[y]==0)
			{
				S[++tot]=y;
			}
		}
	}
	ll ans=0;
	for(int i=1;i<=sum;++i)
	{
		ans=max(ans,f[i]);
	}
    cout<<ans<<endl;
    return  0;
}
2022/10/19 17:09
加载中...