90pts求助
查看原帖
90pts求助
342494
wxh666楼主2023/5/3 10:17
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef int lsqxx;
struct lq{
    lsqxx v,nxt,w;
}e[200005],g[200005];
lsqxx h[20005],cnt,gh[20005],gcnt;
void add(lsqxx u,lsqxx v)
{
    e[++cnt].v=v;e[cnt].nxt=h[u];h[u]=cnt;
}
void addg(lsqxx u,lsqxx v,lsqxx w)
{
	g[++gcnt].v=v;g[gcnt].nxt=gh[u];gh[u]=gcnt;g[gcnt].w=w;
}
int n,m;
int x,y;
int dfn[20005],low[20005],refn[20005];
int vis[20005],dis[20005];
int dfnx;
void tarjan(int t)
{
    dis[t]=1;
    vis[t]=1;
    if(!dfn[t])
        dfn[t]=low[t]=++dfnx,refn[dfnx]=t;
    for(int i=h[t];i;i=e[i].nxt)
    {
        int v=e[i].v;
        if(vis[v])
        {
            if(dis[refn[low[v]]])
                low[t]=min(low[t],low[v]);
        }
        else
        {
            tarjan(v);
            low[t]=min(low[t],low[v]);
        }
    }
    dis[t]=0;
}
int cnts[20005],ans;
int getfa(int x)//传入结点,传出dfn序 
{
	if(low[x]==dfn[x]) return low[x];
	return low[x]=getfa(refn[low[x]]);
}
int vcnt;
int a[20005],b[20005],d[20005];
queue<int>q;
void TP()
{
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int i=gh[u];i;i=g[i].nxt)
		{
			int v=g[i].v,w=g[i].w;
			d[v]--;
			b[v]=max(b[v],b[u]+w);
			if(!d[v])
				q.push(v);
		}
	}
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    	scanf("%lld",&a[i]);
    for(int i=1;i<=m;i++)
        scanf("%lld%lld",&x,&y),add(x,y);
    for(int i=1;i<=n;i++)
        if(!vis[i])
            tarjan(i);
    for(int i=1;i<=n;i++)
    	getfa(i);
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)
    {
    	if(low[i]==dfn[i])
    		if(vis[i])
    			b[vis[i]]+=a[i];
    		else
    			vis[i]=++vcnt,
    			b[vis[i]]+=a[i];
    	else
    		if(vis[refn[low[i]]])
    			b[vis[refn[low[i]]]]+=a[i];
    		else
    			vis[refn[low[i]]]=++vcnt,
    			b[vis[refn[low[i]]]]+=a[i];
	}
	for(int i=1;i<=n;i++)
		for(int j=h[i];j;j=e[j].nxt)
		{
			int v=e[j].v;
			if(low[i]==low[v]) continue;
			addg(vis[refn[low[i]]],vis[refn[low[v]]],b[vis[refn[low[v]]]]);
			d[vis[refn[low[v]]]]++;
		}
	for(int i=1;i<=vcnt;i++)
		if(!d[i]) q.push(i);
	TP();
	int ans=0;
	for(int i=1;i<=vcnt;i++)
		ans=max(ans,b[i]);
	cout<<ans;
    return 0;
}
2023/5/3 10:17
加载中...