社区讨论
求助,60分
P3387【模板】缩点参与者 4已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mi6i2x1h
- 此快照首次捕获于
- 2025/11/20 05:14 4 个月前
- 此快照最后确认于
- 2025/11/20 05:14 4 个月前
可以帮忙看下有什么问题吗,谢谢
CPP#include<bits/stdc++.h>
#define N 10010
using namespace std;
struct Edge{
int next,num;
}e[20*N];
vector<int> Point[N],E[N];
int l,Time,cnt,tot,dfn[N],low[N],in[N],st[N],num[N],v[N],vis[N];
long long f[N],V[N];
void add(int x,int y){
e[++cnt]=(Edge){e[x].next,y};
e[x].next=cnt;
}
void tarjan(int x){
dfn[x]=low[x]=++Time;
in[x]=1;st[++l]=x;
for(int p=e[x].next;p;p=e[p].next){
int k=e[p].num;
if(!dfn[k]){
tarjan(k);
low[x]=min(low[x],low[k]);
}else if(in[k]) low[x]=min(low[x],dfn[k]);
}
if(low[x]==dfn[x]){
tot++;
while(1){
num[st[l]]=tot;
Point[tot].push_back(st[l]);
in[st[l]]=1;V[tot]+=v[st[l--]];
if(st[l+1]==x) break;
}
}
}
void dfs(int x){
vis[x]=1;
for(int i=0;i<E[x].size();i++){
int k=E[x][i];
if(!vis[k]){
dfs(k);
f[x]=max(f[x],f[k]);
}
}
f[x]+=V[x];
}
int main(){
int n,m;
scanf("%d%d",&n,&m);cnt=n;
for(int i=1;i<=n;i++) scanf("%d",&v[i]);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(int i=1;i<=n;i++)
if(!dfn[i]){
Time=0;l=0;
tarjan(i);
}
for(int i=1;i<=n;i++)
for(int p=e[i].next;p;p=e[p].next){
int k=e[p].num;
if(num[i]!=num[k]) E[num[i]].push_back(num[k]);
}
long long ans=0;
for(int i=1;i<=tot;i++)
if(!vis[i]){
dfs(i);
ans=max(ans,f[i]);
}
printf("%lld\n",ans);
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...