40分求调
查看原帖
40分求调
893608
cx2021ghj楼主2024/10/22 08:37
#include<bits/stdc++.h>
using namespace std;
int m,u,v,head2[200009],in[200009],dis[200009],n,p[200009],h[200009],vis[200009],tot,cnt,head[200009],low[200009],tim,dfn[200009];
stack<int> st;
struct ghj{
	int from,to,next;
}edge[200009],edge2[200009];
void add(int x,int y){
	edge[++tot].next=head[x];
	edge[tot].to=y;
	edge[tot].from=x;
	head[x]=tot;
}
void tarjan(int x){
	low[x]=dfn[x]=++tim;
	st.push(x);
	vis[x]=1;
	for(int i=head[x];i;i=edge[i].next){
		int v=edge[i].to;
		if(!dfn[v]){
			tarjan(v);
			low[x]=min(low[x],low[v]);
		}
		else
			if(vis[v]) low[x]=min(low[x],low[v]);
	}
	if(dfn[x]==low[x]){
		int y;
		while(st.size()){
			y=st.top();
			st.pop();
			h[y]=x;
			vis[y]=0;
			if(x==y) break;
			p[x]+=p[y];
		}
	}
}
int topo(){
	queue<int> q;
	int tot=0;
	for(int i=1;i<=n;i++){
		if(h[i]==i && !in[i]){
			q.push(i);
			dis[i]=p[i];
		}
	}
	while(q.size()){
		int x=q.front();
		q.pop();
		for(int i=head[x];i;i=edge2[i].next){
			int v=edge2[i].to;
			dis[v]=max(dis[v],dis[x]+p[v]);
			if((--in[v])==0) q.push(v);
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++) ans=max(ans,dis[i]);
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>p[i];
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		add(u,v);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
	for(int i=1;i<=m;i++){
		int x=h[edge[i].from],y=h[edge[i].to];
		if(x!=y){
			edge2[++cnt].next=head2[x];
			edge2[cnt].to=y;
			head2[x]=cnt;
			in[y]++;
		}
	}
	cout<<topo();
}
2024/10/22 08:37
加载中...