70求条
查看原帖
70求条
1040353
zhangshirui楼主2025/1/12 11:22
#include<bits/stdc++.h>
#define ll long long
using namespace std;
bool instack[10005];
int tot=0,n,m;
int sum[10005],g[10005],s[10005];
bool vis[10005];
int ans[10005];
vector<int> edge[10005],edge2[10005];
stack<int> stk;
void tarjan(int u){
	g[u]=++tot;
	int k=tot;
	instack[u]=1;
	stk.push(u);
	for(int i:edge[u]){
		if(g[i]==0){
			tarjan(i);
			g[u]=min(g[u],g[i]);
		}
		if(instack[i]&&g[i])g[u]=min(g[u],g[i]);
	}
	if(k==g[u]){
		while(stk.top()!=u){
			g[stk.top()]=u;
			stk.pop();
		}
		stk.pop();
	}
}
int dfs(int u){
	int re=0;
	if(vis[u])return ans[u];
	vis[u]=1;
	for(int i:edge2[u])re=max(re,dfs(i));
	return ans[u]=re+sum[u];
}
int find(int u){
	if(g[u]==u)return g[u];
	return g[u]=find(g[u]);
}
int main(){
	ios::sync_with_stdio(0);
//	freopen("P3387_1.in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>s[i];
	for(int i=0;i<m;i++){
		int a,b;
		cin>>a>>b;
		edge[a].push_back(b);
	}
	for(int i=1;i<=n;i++)if(g[i]==0)tarjan(i);
	for(int i=1;i<=n;i++){
		sum[g[i]]+=s[i];
		for(int j:edge[i])if(g[i]!=g[j])edge2[g[i]].push_back(g[j]);
	}
	int anss=0;
	for(int i=1;i<=n;i++)anss=max(anss,dfs(g[i]));
	cout<<anss;
}
2025/1/12 11:22
加载中...