50分 玄关求条
查看原帖
50分 玄关求条
1419569
Z_kazuha楼主2024/11/28 10:39
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
#define int long long
int n,m,a[N],head[N<<1],cnt,dfn[N],tot,c[N],low[N],tim,st[N],top,sum[N],head1[N<<1],cnt1;
struct node{int to,nxt;}e[N<<1],e1[N<<1];
void add(int u,int v){e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;}
void add1(int u,int v){e1[++cnt1].to=v;e1[cnt1].nxt=head1[u];head1[u]=cnt1;}
void tarjan(int x){
	dfn[x]=low[x]=++tim;
	st[++top]=x;
	for(int i=head[x];i;i=e[i].nxt){
		int y=e[i].to;
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}else if(!c[y]){
			low[x]=min(low[x],dfn[y]);
		}
	}
	if(dfn[x]==low[x]){
		c[x]=++tot;
		sum[tot]+=a[x];
		while(st[top]!=x){
			c[st[top]]=tot;
			sum[tot]+=a[st[top--]];
		}
		top--;
	}
}
int in[N],dis[N];
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i])tarjan(i);
	}
	for(int i=1;i<=n;i++){
		for(int j=head[i];j;j=e[j].nxt){
			int v=e[i].to;
			if(c[i]!=c[v]){
				add1(c[i],c[v]);
				in[c[v]]++;
			}			
		}
	}
	queue<int> q;
	for(int i=1;i<=tot;i++){
		dis[i]=sum[i];
		if(!in[i])q.push(i);
	}
	while(q.size()){
		int u=q.front();
		q.pop();
		for(int i=head1[u];i;i=e1[i].nxt){
			int v=e1[i].to;
			dis[v]=max(dis[v],dis[u]+sum[v]);
			in[v]--;
			if(!in[v])q.push(v);
		}	
	}
	int ans=0;
	for(int i=1;i<=tot;i++){
		ans=max(ans,dis[i]);
	}
	cout<<ans;
	return 0;
}
2024/11/28 10:39
加载中...