50pts,WA on#1,4,5,7,9,悬关求调
查看原帖
50pts,WA on#1,4,5,7,9,悬关求调
1070708
Caged_Bird楼主2024/5/26 20:41

代码:

#include<bits/stdc++.h>
#define int long long 
using namespace std;
struct edge{
	int from,to;
}e[100005];
stack<int>st;
int n,m,SCC[100005],dfn[100005],sum,ru[100005];
int ans[100005],low[100005],tot,v[100005],nv[100005];
vector<int>a[100005];
vector<int>b[100005];
queue<int>q;
bool vis[100005],used[100005];
int dp[10005];
void tarjan(int now){
	vis[now]=true;
	st.push(now);
	dfn[now]=low[now]=++tot;
	for(int i=0;i<a[now].size();i++){
		if(!vis[a[now][i]]){
			tarjan(a[now][i]);
			low[now]=min(low[now],low[a[now][i]]);
		} 
		else{
			low[now]=min(low[now],dfn[a[now][i]]);
		}
	}
	if(low[now]==dfn[now]){
		sum++;
		while(!st.empty()&&st.top()!=now){
			SCC[st.top()]=sum;
			st.pop();
		}
		SCC[now]=sum;
		st.pop();
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>v[i];
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		e[i].from=u;
		e[i].to=v;
		a[u].push_back(v);
	}
	tarjan(1);
	for(int i=1;i<=n;i++){
		nv[SCC[i]]+=v[i];
	}
	for(int i=1;i<=m;i++){
		if(SCC[e[i].from]!=SCC[e[i].to]){
			b[SCC[e[i].from]].push_back(SCC[e[i].to]);
			ru[SCC[e[i].to]]++;
		}
	}
	for(int i=1;i<=sum;i++){
		if(!ru[i]){
			q.push(i);
			dp[i]=nv[i];
		}
	}
	while(!q.empty()){
		int t=q.front();
		q.pop();
		for(int i=0;i<b[t].size();i++){
			dp[b[t][i]]=max(dp[b[t][i]],dp[t]+nv[b[t][i]]);
			ru[b[t][i]]--;
			if(!ru[b[t][i]]){
				q.push(b[t][i]);
			}
		}
	}
	int ans=0;
	for(int i=1;i<=sum;i++){
		ans=max(ans,dp[i]);
	} 
	cout<<ans;
	return 0;
}

2024/5/26 20:41
加载中...