啊······50pts,哇了五个点······
查看原帖
啊······50pts,哇了五个点······
472950
封禁用户楼主2021/10/31 16:50
#include<bits/stdc++.h>
using namespace std;

int n,m,ans,a[10005],dfn[10005],low[10005],iwc[10005],wa[10005],out[10005],dp[10005],cnt=1,tot=1;
vector<int>mp[10005],mp2[10005];
bool stac[10005];
queue<int>q;
stack<int>s;

void dfs(int now){
	dfn[now]=low[now]=cnt++;
	stac[now]=1;
	s.push(now);
	for(int o=0;o<mp[now].size();o++){
		if(!dfn[mp[now][o]]){
			dfs(mp[now][o]);
			low[now]=min(low[now],low[mp[now][o]]);
		}
		else if(stac[mp[now][o]]){
			low[now]=min(low[now],low[mp[now][o]]);
		}
	}
	if(dfn[now]==low[now]){
		while(s.size()){
			iwc[s.top()]=tot;
			stac[s.top()]=0;
			wa[tot]+=a[s.top()];
			s.pop();
		}
		tot++;
	}
}

void crack(int now){
	for(int o=0;o<mp2[now].size();o++){
		out[mp2[now][o]]--;
		dp[mp2[now][o]]=max(dp[mp2[now][o]],dp[now]+wa[mp2[now][o]]);
		if(!out[mp2[now][o]]){
			q.push(mp2[now][o]);
		}
	}
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	while(m--){
		int nw,nt;
		cin>>nw>>nt;
		mp[nw].push_back(nt);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			dfs(i);
		}
	}
	for(int i=1;i<=n;i++){
		for(int o=0;o<mp[i].size();o++){
			if(iwc[i]!=iwc[mp[i][o]]){
				mp2[iwc[mp[i][o]]].push_back(iwc[i]);
				out[iwc[i]]++;
			}
		}
	}
	tot--;
	for(int ni=1;ni<=tot;ni++){
		if(!out[ni]){
			q.push(ni);
			dp[ni]=wa[ni];
		}
	}
	while(q.size()){
		crack(q.front());
		ans=max(ans,dp[q.front()]);
		q.pop();
	}
	cout<<ans;
	return 0;
}

hope大佬will-help

2021/10/31 16:50
加载中...