社区讨论
我真的没招了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 条回复,欢迎继续交流。
正在加载回复...