求求求求求
查看原帖
求求求求求
315398
小杨小小杨楼主2021/9/12 20:36

tarjan太不友好惹555……
样例错误惹5555……
输出0呜呜呜……
大佬救命呜呜呜……
code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<map>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1e5+15;
int n,m,sum,tim,top,s;
int f[maxn],head[maxn],sd[maxn],dfn[maxn],low[maxn],stack[maxn],in_stack[maxn],u,v;
int h[maxn],ID[maxn],dp[maxn],t;
vector<int> e[maxn];
struct EDGE
{
	int to;int next;int from;
}edge[100000];
void add(int x,int y)
{
	edge[++sum].next=head[x];
	edge[sum].from=x;
	edge[sum].to=y;
	head[x]=sum;
}
void tarjan(int now){
	dfn[now]=low[now]=++tim;
	in_stack[now]=1;
	stack[++t]=now;
	for (int i=head[now];i;i=edge[i].next)
		if (dfn[edge[i].to]==0)
			tarjan(edge[i].to),low[now]=min(low[now],low[edge[i].to]);
		else if (in_stack[edge[i].to]==0)
			low[now]=min(low[now],dfn[edge[i].to]);
	if (dfn[now]==low[now]){
		int cur;
		do{
			cur=stack[t];
			t--;
			sd[cur]=now;
			in_stack[cur]=0;
			if (now==cur) break;
			f[now]+=f[cur];
			
		}while (now!=cur);
	}
}
int topo(){
	queue<int> q;
	int tot=0;
	for (int i=1;i<=n;i++)
		if (sd[i]&&!ID[i]) q.push(i),dp[i]=f[i];
	while (!q.empty()){
		int k=q.front();q.pop();
		for (int i=0;i<e[k].size();i++){
			int v=e[k][i];
			dp[v]=max(dp[v],dp[k]+f[v]);
			ID[v]--;
			if (!ID[v]) q.push(v);
		}
	}
	int ans=0;
	for (int i=1;i<=n;i++) ans=max(ans,dp[i]);
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++) scanf("%d",&f[i]);
	for (int i=1;i<=m;i++)
		scanf("%d%d",&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,y;x=sd[edge[i].from];y=sd[edge[i].to];
		if (x!=y) e[x].push_back(y),ID[y]++;
	}
	printf("%d",topo());
    return 0;
}

找出的人无条件关注(最好互关嘤嘤嘤) 小杨小小杨《——菜死了

2021/9/12 20:36
加载中...