求条,玄关
查看原帖
求条,玄关
710862
thrX楼主2024/10/15 15:14
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5,maxm=1e5+7;
int n,m;
vector<int> e[maxn];
int dfn[maxn],low[maxn],head[maxm],co[maxn],stk[maxn],grp[maxn],val[maxn];
int top,col,num,cnt;
void add(int u,int v){
	e[u].push_back(v);
} 
void tarjan(int u){
	dfn[u]=low[u]=++num;
	stk[++top]=u;
	for(int i=0;i<e[i].size();i++){
		int v=e[u][i];
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if(!co[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(low[u]==dfn[u]){
		co[u]=++col;
		grp[col]+=val[u];
		while(stk[top]==u){
			grp[col]+=val[stk[top]];
			co[stk[top--]]=col;
		}
		top--;
	}
}
vector<int> nw[maxn];
queue<int> q;
int ind[maxn],oud[maxn],tp[maxn];
int main(){
	
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>val[i];
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i])tarjan(i);
	}
	for(int u=1;u<=n;u++){
		for(int i=0;i<e[i].size();i++){
			int v=e[u][i];
			if(co[u]!=co[v]){
				nw[co[u]].push_back(co[v]);
				ind[v]++,oud[u]++;
			}
		}
	}
	for(int i=1;i<=col;i++){
		if(!ind[i]){
			q.push(i);
			tp[i]=grp[i];
		}
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(auto v:nw[u]){
//			int v=nw[u][i];
			ind[v]--;
			tp[v]=max(tp[v],tp[u]+grp[v]);
			if(!ind[v])q.push(v);
		} 
	}
	int ans=0;
	for(int i=1;i<=col;i++){
		if(!oud[i])ans=max(ans,tp[i]);
	}
	cout<<ans<<'\n';
	
	return 0;
} 

0pts,样例过了,不知道是哪里有问题

用了tarjan和topo

2024/10/15 15:14
加载中...