60pts 求条!!!
查看原帖
60pts 求条!!!
1285683
lz_fruit楼主2025/1/23 12:01

思路就是Tarjan+Topsort+dp,交上去就只有60分,不知道哪错了,求大佬调一调!

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int val[N],wval[N];
int n,m,cnt=0,st[N],low[N],dfn[N],id[N],ind[N],dist[N];
vector<int> G[N];
vector<int> T[N];
bool in[N];

void tarjan(int x)
{
	static int num=0,top=0;
	dfn[x]=low[x]=++num;
	st[++top]=x;in[x]=1;
	for(int y:G[x])
	{
		if(dfn[y]==0)
		{
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else
		{
			if(in[y])
			{
				low[x]=min(low[x],dfn[y]);
			}
		}
	}
	
	int y;
	if(low[x]==dfn[x])
	{
		cnt++;
		do{
			y=st[top--];
			id[y]=cnt;
			wval[cnt]+=val[y];
			in[y]=0;
		}while(y!=x);
	}
}

int topsort()
{
	int ans=-1;
	queue<int> Q;
	for(int i=1;i<=cnt;i++)
	{
		dist[i]=wval[i];
		if(ind[i]==0) Q.push(i);
	}
	while(!Q.empty())
	{
		int x=Q.front();Q.pop();
		for(int i=0;i<T[x].size();i++)
		{
			int y=T[x][i];
			dist[y]=max(dist[y],wval[x]+wval[y]);
			if(ind[y]>0) ind[y]--;
			if(ind[y]==0) Q.push(y);
		}
	}
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,dist[i]);
	}
	return ans;
}

int main()
{
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&val[i]);
	}
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d %d",&x,&y);
		G[x].push_back(y);
	}
	for(int i=1;i<=n;i++)
	{
		if(dfn[i]==0) tarjan(i);
	}
	for(int i=1;i<=n;i++)
	{
		for(int y:G[i])
		{
			if(id[i]==id[y]) continue;
			T[id[i]].push_back(id[y]);
			ind[id[y]]++;
		}
	}
	printf("%d",topsort());
}
2025/1/23 12:01
加载中...