缩点60pts求调
查看原帖
缩点60pts求调
1176197
ljcnoi楼主2025/7/22 14:53

rt

#include<bits/stdc++.h>
#define mp make_pair 
using namespace std;
struct G
{
	int cnt;
	int to[100005],ne[100005],head[10004];
	void init()
	{
		cnt=0;
		memset(to,0,sizeof(to));
		memset(ne,0,sizeof(ne));
		memset(head,0,sizeof(head));
	}
	void add(int x,int y)
	{
		cnt++;
		to[cnt]=y;
		ne[cnt]=head[x];
		head[x]=cnt;
	}
};
G g,t;
int n,m;
int a[10004];
stack<int> st;
int low[10004],dfn[10004],tot=0;
bool ins[10004];
int idx;
int bel[10004],q[10004];
void dfs1(int x)
{
	low[x]=dfn[x]=++tot;
	st.push(x);
	ins[x]=true;
	for(int i=g.head[x];i;i=g.ne[i])
	{
		int y=g.to[i];
		if(!dfn[y])
		{
			dfs1(y);
			low[x]=min(low[x],low[y]);
		}
		else if(ins[y])
		{
			low[x]=min(low[x],dfn[y]);
		}
	}
	if(low[x]==dfn[x])
	{
		int vv;
		idx++;
		do
		{
			vv=st.top();
			//cout<<vv<<" ";
			st.pop();
			ins[vv]=false;
			q[idx]+=a[vv];
			bel[vv]=idx;
		}while(vv!=x);
		//cout<<"\n";
	}
}
int deg[10004];
int f[10004];
queue<int> qu;
void tp()
{
	for(int i=1;i<=idx;i++)
	{
		if(deg[i]==0)
		{
			qu.push(i);
			f[i]=q[i];
		}
	}
	while(!qu.empty())
	{
		int x=qu.front();
		qu.pop();
		for(int i=t.head[x];i;i=t.ne[i])
		{
			int y=t.to[i];
			f[y]=max(f[y],f[x]+q[y]);
			deg[y]--;
			//cout<<y<<" ";
			if(deg[y]==0)
			{
				qu.push(y);
			}
		}
	}
	int ans=0;
	for(int i=1;i<=idx;i++)
	{
		ans=max(ans,f[i]);	
	}
	cout<<ans<<"\n";
}
//set<pair<int,int> > pp;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	g.init();
	t.init();
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		g.add(x,y);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])
		{
			dfs1(i);
		}
	}
	//cout<<"\n";
	for(int i=1;i<=n;i++)
	{
		int x=i;
		for(int j=g.head[x];j;j=g.ne[j])
		{
			int y=g.to[j];
			x=bel[x],y=bel[y];
			if(x!=y/*&&pp.count(mp(x,y))==0*/)
			{
				t.add(x,y);
				//cout<<x<<" "<<y<<"\n";
				deg[y]++;
				//pp.insert(mp(x,y));
			}
		}
	}
	/*for(int i=1;i<=idx;i++)
	{
		cout<<f[i]<<" ";
	}
	cout<<"\n";*/
	//cout<<idx<<" "<<q[1];
	tp();
	/*for(int i=1;i<=idx;i++)
	{
		cout<<deg[i]<<" ";
	}*/
	return 0;
}

WA record

捞一下

2025/7/22 14:53
加载中...