40pts 求条
查看原帖
40pts 求条
1209625
zyd22楼主2025/1/22 11:20

谢谢你非常抱歉

#include<bits/stdc++.h>
using namespace std;
//#define int long long
int n,m;
int he[501000],tot=0,he2[501000],tot2;
struct node{
	int u,v,ne;
}a[5001000],a2[5001000];
void add(int u,int v){
    a[++tot].u=u;
	a[tot].v=v;
	a[tot].ne=he[u];
	he[u]=tot;
}
void add_s(int u,int v){
	a2[++tot].v=v;
	a2[tot].ne=he2[u];
	he2[u]=tot2;
}
int dfn[501000],low[501000],id=0,sum=0;
int c[501000],inst[501000];
int w[501000],w2[501000];
int in[501000];
vector<int> ans[501000];
stack<int> st;
void tarjan(int u){
	dfn[u]=low[u]=++id;
	st.push(u);
	inst[u]=1;
	for(int i=he[u];i;i=a[i].ne){
		int v=a[i].v;
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(inst[v]) low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u]){
		int top=0;
		sum++;
		w2[sum]=0;
		while(top!=u){
			top=st.top();
			st.pop();
			inst[top]=0;
			c[top]=sum;
			w2[sum]+=w[top];
// 			for(int i=he[top];i;i=a[i].ne){
// 			    int v=a[i].v;
// 			    if(qiang[top]!=qiang[v]) 
// 			        add_s(qiang[top],qiang[v]),in[qiang[v]]++;
// 			}
		}
	}
}
int mx=-0x3f3f3f3f,dp[501000];
queue<int> q;
void tp(){
    for(int i=1;i<=sum;i++){
        if(in[i]==0) q.push(i),dp[i]=w2[i];
        //mx=max(dp[i],mx);
    }
    while(!q.empty()){
        int u=q.front();
        q.pop();
        dp[u]=max(dp[u],w2[u]);
        for(int i=he2[u];i;i=a2[i].ne){
            int v=a2[i].v;
            dp[v]=max(dp[v],dp[u]+w2[v]);
            //mx=max(dp[v],mx);
            in[v]--;
            if(in[v]==0) q.push(v);
        }
    }
}
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		//if(u==v) continue;
		add(u,v);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
	for(int i=1;i<=tot;i++){
		int u=a[i].u,v=a[i].v;
		if(c[u]!=c[v]) add_s(c[u],c[v]),in[c[v]]++;
	}
	tp();
	for(int i=1;i<=sum;i++) mx=max(mx,dp[i]);
	printf("%d\n",mx);
	return 0;
}
2025/1/22 11:20
加载中...