缩点模板求调
查看原帖
缩点模板求调
616733
Lysea楼主2022/10/2 21:02

题目传送门

#include<bits/stdc++.h>
#define N 100005
using namespace std;
struct star{
	int to,next;
}e[N],e1[N];
bool vis[N];
int dfn[N],low[N],sck[N],fnt,num,head[N],head1[N],cnt,cnt1,n,m,dot[N],bel[N],dp[N],in[N],ans;
void add(int u,int v){
	e[++cnt].next=head[u];
	head[u]=cnt;
	e[cnt].to=v;
}
void add1(int u,int v){
	e1[++cnt1].next=head1[u];
	head1[u]=cnt1;
	e1[cnt1].to=v;
}
void tp_sort(){
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(!in[i]&&bel[i]==i) q.push(i),dp[i]=dot[i];
	}
	while(!q.empty()){
		int t=q.front();
		q.pop();
		for(int i=head1[t];i;i=e1[i].next){
			int y=e1[i].to;
			dp[y]=max(dp[y],dp[t]+dot[y]);
			in[y]--;
			if(!in[y]) q.push(y);
		}
	}
}
void Tarjan(int x){
	dfn[x]=low[x]=++num;
	sck[++fnt]=x;
	vis[x]=true;
	for(int i=head[x];i;i=e[i].next){
		int y=e[i].to;
		if(!dfn[y]){
			Tarjan(y);
			low[x]=min(low[x],low[y]);
		}else if(vis[y]) low[x]=min(low[x],low[y]);
	}
	if(dfn[x]==low[x]){
		while(int y=sck[fnt--]){
			bel[y]=x;
			vis[y]=false;
			if(x==y) break;
			dot[x]+=dot[y];
		}
	}
}
void rebuild(){
	for(int i=1;i<=n;i++){
		for(int j=head[i];j;j=e[j].next){
			int y=e[j].to;
			if(bel[i]!=bel[y]){
				in[bel[y]]++;
				add1(bel[i],bel[y]);
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>dot[i];
	for(int i=1,u,v;i<=n;i++){
		cin>>u>>v;
		add(u,v);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);
	rebuild();
	tp_sort();
	for(int i=1;i<=n;i++){
		ans=max(ans,dp[i]);
	}cout<<ans<<endl;
	return 0;
}

全WA掉,有没有dalao帮一下

2022/10/2 21:02
加载中...