社区讨论
求解 40分
P3387【模板】缩点参与者 5已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mi6ib9l7
- 此快照首次捕获于
- 2025/11/20 05:20 4 个月前
- 此快照最后确认于
- 2025/11/20 05:20 4 个月前
CPP
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#define N 100005*2
#include <set>
using namespace std;
int n,m;
int dfn[N];
int tim=0;
int topp=0;
int low[N];
int bel[N];
int cnt;
bool v[N];
int stack[N];
int out[N];
int in[N];
int size[N];
vector <int> g[N];
vector <int> f[N];
set <int> to[N];
int val[N];
int qian[N];
int ans=0;
int xx[N];
int yy[N];
int dis[N];
bool vis[N];
void tarjan(int u){
dfn[u]=low[u]=++tim;
stack[++topp]=u;
v[u]=true;
for(int i=0;i<g[u].size();i++){
int dmf=g[u][i];
if(!dfn[dmf]){
tarjan(dmf);
low[u]=min(low[u],low[dmf]);
}
else if(v[dmf]) low[u]=min(low[u],dfn[dmf]);
}
if(low[u]==dfn[u]){
cnt++;
int vv;
do{
vv=stack[topp--];
v[vv]=false;
bel[vv]=cnt;
qian[cnt]+=val[vv];
}while(vv!=u);
}
}
inline void rebuild(){
for(int i=1;i<=m;i++){
if(bel[xx[i]]!=bel[yy[i]])
f[xx[i]].push_back(yy[i]);
}
}
inline void spfa(int u){
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
queue<int>q;
q.push(u);
vis[u]=true;
dis[u]=qian[u];
while(!q.empty()){
int d2=q.front();
q.pop();
vis[d2]=0;
int tt=f[d2].size();
for(int i=0;i<tt;++i){
if(dis[f[d2][i]]<qian[f[d2][i]]+dis[d2])
{
dis[f[d2][i]]=qian[f[d2][i]]+dis[d2];
if(!vis[f[d2][i]]){
vis[f[d2][i]]=1;
q.push(f[d2][i]);
}
}
}
}
for(int i=1;i<=cnt;i++) ans=max(ans,dis[i]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
}
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
xx[i]=u;
yy[i]=v;
g[u].push_back(v);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
rebuild();
for(int i=1;i<=cnt;i++){
spfa(i);
}
printf("%d",ans);
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...