爆零力(悲
查看原帖
爆零力(悲
713914
Phoenix_2010楼主2024/7/31 21:19

求调

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int T,n,m,s,p,w[N],id[N],dfn[N],low[N],scc[N],cnt,in[N];long long tmp[N],maxx,dp[N];bool ins[N];stack<int> stk;vector<int> a[N],A[N],tp;
void dfs(int u)
{
	dfn[u]=low[u]=++T,stk.push(u),ins[u]=true;
	for(auto v:a[u])
	{
		if(!dfn[v]) dfs(v),low[u]=min(low[u],low[v]);
		else if(ins[v]) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u])
	{
		cnt++;
		while(true)
		{
			int x=stk.top();stk.pop();ins[x]=false;
			scc[x]=cnt;
			if(x==u) break;
		}
	}
}
void toposort()
{
	queue<int> q;q.push(scc[s]);dp[scc[s]]=w[scc[s]];
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(auto v:a[u]){dp[v]=max(dp[v],dp[u]+w[v]);if(!(--in[v])) q.push(v);}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;scanf("%d%d",&u,&v);
		a[u].push_back(v);
	}
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);
	cin>>s>>p;
	for(int i=1;i<=p;i++) scanf("%d",&id[i]);
	dfs(s);
	for(int u=1;u<=n;u++)
	{
		tmp[scc[u]]+=w[u];
		for(auto v:a[u]) if(scc[u]!=scc[v]) A[scc[u]].push_back(scc[v]),in[scc[v]]++;
	}
	memcpy(w,tmp,sizeof(w));for(int i=1;i<=cnt;i++) a[i]=A[i];
	toposort();
	for(int i=1;i<=p;i++) maxx=max(maxx,dp[scc[id[i]]]);cout<<maxx;
	return 0;
}
2024/7/31 21:19
加载中...