社区讨论
90分WA #7求条,赏两关
P3387【模板】缩点参与者 2已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mkji3t7j
- 此快照首次捕获于
- 2026/01/18 16:55 上个月
- 此快照最后确认于
- 2026/01/21 23:55 4 周前
第 个测试点应输出 ,但我的代码输出 。
CPP#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[10010],a1[10010];
vector<int> v[10010],vv[10010],v1[10010];
int vis[10010],num[10010],cnt;
int st[10010],si;
int f[10010],sf[10010],fi,fd[10010];
void dfs(int x){
for(int i=0;i<v[x].size();i++){
int j=v[x][i];
if(num[j]) continue;
num[j]=++cnt;
st[++si]=j;
dfs(j);
}
}
//stack<int> x;
void dfs1(int x,int fa){
f[x]=fa;
vis[x]=1;
if(x==fa) sf[++fi]=fa;
a1[fa]+=a[x];
for(int i=0;i<vv[x].size();i++){
int j=vv[x][i];
if(vis[j]) continue;
dfs1(j,fa);
}
}
int ans;
queue<int> q;
int sum[10010],in[10010];
void bfs(){
q.push(0);
sum[0]=0;
while(q.size()){
int x=q.front();
q.pop();
for(int i=0;i<v1[x].size();i++){
int j=v1[x][i];
sum[j]=max(sum[j],sum[x]+a1[j]);
ans=max(ans,sum[j]);
in[j]--;
if(!in[j]) q.push(j);
}
}
}
int main(){
// ios::sync_with_stdio(0);
// cin.tie(0); cout.tie(0);
freopen("P3387_7.in","r",stdin);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
v[0].push_back(i);
}
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
v[x].push_back(y);
vv[y].push_back(x);
}
num[0]=1;
dfs(0);
for(int i=n;i>=1;i--){
if(vis[st[i]]) continue;
dfs1(st[i],st[i]);
}
for(int x=1;x<=n;x++){
for(int i=0;i<v[x].size();i++){
int j=v[x][i];
if(f[x]==f[j]) continue;
v1[f[x]].push_back(f[j]);
in[f[j]]++;
}
// cout<<f[x]<<" ";
}
// cout<<"\n";
for(int i=1;i<=fi;i++) v1[0].push_back(sf[i]),in[i[sf]]++;
bfs();
cout<<ans;
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...