社区讨论

我真的没招了60pts

P3387【模板】缩点参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mihffda8
此快照首次捕获于
2025/11/27 20:45
3 个月前
此快照最后确认于
2025/11/27 20:58
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define N 500005
using namespace std;
bool vis[N];
queue<int>q;
int n,m,t,cnt,ans,tot,TOT,h[N],H[N],f[N],s[N],fa[N],in[N],val[N],dfn[N],low[N];
struct NM{int u,v;}a[N];
struct NN{int to,nxt;}e[N<<1],E[N<<1];
void add(int x,int y){e[++tot]={y,h[x]},h[x]=tot;}
void Add(int x,int y){E[++TOT]={y,H[x]},H[x]=TOT;}
void tarjan(int x){
    dfn[x]=low[x]=++cnt,s[++t]=x,vis[x]=1;
    for(int i=h[x],v;i;i=e[i].nxt){
        if(!dfn[(v=e[i].to)])
            tarjan(v),low[x]=min(low[x],low[v]);
        else if(vis[v]) low[x]=min(low[x],dfn[v]);
    }
    if(dfn[x]==low[x]){
        do{
            vis[s[t]]=0,fa[s[t]]=x;
            if(s[t]!=x) val[x]+=val[s[t]];
        }while(s[t--]!=x);
    }
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&val[i]);
    for(int i=1,x,y;i<=m;i++){
        scanf("%d%d",&a[i].u,&a[i].v);
        add(a[i].u,a[i].v);
    }
    for(int i=1;i<=n;i++)
        if(!dfn[i]) tarjan(i);
    for(int i=1;i<=m;i++){
        int x=fa[a[i].u],y=fa[a[i].v];
        if(x!=y) Add(x,y),in[y]++;
    }
	for(int i=1;i<=n;i++)
		if(i==fa[i]&&!in[i])
			q.push(i),f[i]=val[i];
	while(!q.empty()){
		int x=q.front();q.pop();
		for(int i=H[x],v;i;i=E[i].nxt){
			f[v=E[i].to]=max(f[v],f[x]+val[v]);
			if(--in[v]==0) q.push(v);
		}
	}
    for(int i=1;i<=n;i++) ans=max(ans,f[i]);
    printf("%d",ans);
	return 0;
}
这错哪里了?感觉再改下去就要跟题解一样了

回复

0 条回复,欢迎继续交流。

正在加载回复...