社区讨论

发现一个诡异的现象,求大佬解释

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 条回复,欢迎继续交流。

正在加载回复...