社区讨论
发现一个诡异的现象,求大佬解释
P3387【模板】缩点参与者 9已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 12 条
- 当前快照
- 1 份
- 快照标识符
- @mih7faih
- 此快照首次捕获于
- 2025/11/27 17:01 3 个月前
- 此快照最后确认于
- 2025/11/28 19:56 3 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
long long n,m,stk[114514],snt,bel[114514],id,siz[114514],ct[114514],vis[114514],a[114514],kkk[114514],snt2,ans;
vector<long long>e[114514],ei[114514],ide[114514];
void eadd(int u,int v){
e[u].push_back(v);
ei[v].push_back(u);
}
void dfs1(int u){
vis[u] = 1;
for(int i:e[u]){
if(!vis[i]){
dfs1(i);
}
}stk[++snt] = u;
}
void dfs2(int u,int iid){
vis[u] = 1;
bel[u] = iid;
kkk[iid] += a[u];
siz[iid]++;
for(int i:ei[u]){
if(!vis[i])dfs2(i,iid);
}
}
void dfs3(int u){
long long mkkk = 0;
vis[u] = 1;
for(int i:ide[u]){
if(!vis[i]){
dfs3(i);
}mkkk = max(mkkk,kkk[i]);
}
kkk[u]+=m[kkk];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
eadd(u,v);
}
for(int i=1;i<=n;i++){
if(!vis[i])dfs1(i);
}
memset(vis,0,sizeof(vis));
while (snt){
int u = stk[snt--];
if(!vis[u])dfs2(u,++id);
}
for(int i=1;i<=n;i++){
for(int v:e[i]){
if(bel[i] == bel[v])continue;
ide[bel[i]].push_back(bel[v]);
}
}memset(vis,0,sizeof(vis));
for(int i=1;i<=id;i++){
if(!vis[i])dfs3(i);
}
for(int i=1;i<=id;i++){
ans = max(ans,kkk[i]);
}
cout<<ans;
return 0;
}
34行的变量mkkk手误多打了一个中括号,但并未报错,只会WA,用了-Wall后也没有任何警告,难道说c++是允许用数组给变量当下标的?
回复
共 13 条回复,欢迎继续交流。
正在加载回复...