求助P3387[悬赏10关]全机房关注
  • 板块灌水区
  • 楼主oberzhang
  • 当前回复63
  • 已保存回复66
  • 发布时间2024/7/20 15:12
  • 上次更新2024/7/27 10:39:53
查看原帖
求助P3387[悬赏10关]全机房关注
952913
oberzhang楼主2024/7/20 15:12

为什么加上注释的那句话就不能ac

注释的那句话在dfs里是low[y]=u;

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n,m,cnt,dfn[N],low[N],in[N],st[N],top,a[N],dis[N],sd[N];
vector<int>vec[N],ne[N];
bool stk[N];
void dfs(int u,int d){
	dfn[u]=low[u]=++cnt;
	st[++top]=u;
	stk[u]=1;
	for(auto v:vec[u]){
		if(!dfn[v]){
			dfs(v,u);
			low[u]=min(low[u],low[v]);
		}else if(stk[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(dfn[u]==low[u]){
		int y;
		while(y=st[top--]){
			//low[y]=u;
			sd[y]=u;
			stk[y]=0;
			if(u==y)return;
			a[u]+=a[y];
		}
	}
}
int redfs(){
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(sd[i]==i && in[i]==0){
			q.push(i);
			dis[i]=a[i];
		}
	}
	int ans=0;
	while(!q.empty()){
		int k=q.front();
		q.pop();
		for(auto v:ne[k]){
			dis[v]=max(dis[v],dis[k]+a[v]);
			in[v]--;
			if(in[v]==0)q.push(v);
		}
	}
	for(int i=1;i<=n;i++)ans=max(ans,dis[i]);
	return ans;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		vec[u].push_back(v);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			dfs(i,i);
		}
	}
	for(int u=1;u<=n;u++){
		for(auto v:vec[u]){
			if(sd[u]!=sd[v]){
				ne[sd[u]].push_back(sd[v]);
				in[sd[v]]++;
			}
		}
	}
	cout<<redfs();
	return 0;
}

2024/7/20 15:12
加载中...