40pts求调
查看原帖
40pts求调
484751
ssl_lwz楼主2023/11/14 21:59
#include <bits/stdc++.h>
#define rep(i,x,y)  for(int i=x;i<=y;i++)
using namespace std;
typedef pair<int,int> PI;
const int N = 1e6 + 10;
int n,a[N],m,ans,dfn[N],low[N],tot,vis[N],num[N],cnt,in[N],f[N];
vector<int> v[N],g[N];queue<int> q;
stack<int> sta;
PI d[N];
int dis[N];
bool bits[N];
void tarjan(int p){
	dfn[p]=low[p]=++tot;
	sta.push(p);
	vis[p]=1;
	for(int i:v[p]){
		if(!dfn[i]){
			tarjan(i);
			low[p]=min(low[p],low[i]);
		}
		else if(vis[i]){
			low[p]=min(low[p],dfn[i]);
		}
	}
	//删掉环上的点
	if(low[p]==dfn[p]){
		while(sta.top()!=p){
			int y=sta.top();
			sta.pop();
			num[y]=p;
			a[p]+=a[y];
			vis[y]=0;
		}
		num[p]=p;vis[p]=1;
		sta.pop();
	} 
}
void topu(){
	while(q.size()){
		int t=q.front();//cout<<t;
		q.pop();
		for(int i:g[t]){
			f[i]=max(f[i],f[t]+a[i]);
			ans=max(ans,f[i]);
			if(!bits[i]){
				q.push(i);
			}
		}
	}
}
signed main(){
	cin>>n>>m;
	rep(i,1,n)  cin>>a[i];
	rep(i,1,m){
		int x,y;
		cin>>x>>y;
		d[i]={x,y};
		v[x].push_back(y);
	}
	rep(i,1,n)  if(!dfn[i])  tarjan(i);
	rep(i,1,m){
		//cout<<vis[d[i].first]<<" "<<vis[d[i].second]<<endl;
		int x=d[i].first,y=d[i].second;
		if(num[x]!=num[y]){
		//	cout<<d[i].first<<" "<<d[i].second<<endl;
			++cnt;
			g[num[x]].push_back(num[y]);
			in[num[x]]++;
		}
	}
    rep(i,1,n){
    	if(num[i]==i&&!in[i]){
    		f[i]=a[i];
    		bits[i]=true;
    		q.push(i);
    		ans=max(ans,f[i]);
		}
	}topu();
	cout<<ans;
    return 0;
}
2023/11/14 21:59
加载中...