35pts玄关求调

P3366 【模板】最小生成树

### 第二版58pts ```cpp #include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<queue> #include<map> #include<stack> using namespace std; int nimm[5001]; int a[5001][5001]; bool b[5001]; bool ap[5001][5001]; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++){ int x,y,z; cin>>x>>y>>z; if(x==y) continue; if(ap[x][y]==0){ a[x][y]=z; a[y][x]=z; ap[x][y]=1; ap[y][x]=1; } else{ a[x][y]=min(z,a[x][y]); a[y][x]=min(z,a[y][x]); } } memset(nimm,0x7f,sizeof(nimm)); nimm[1]=0; memset(b,1,sizeof(b)); for(int i=1;i<=n;i++){ int k=0; for(int j=1;j<=n;j++){ if(b[j]==1&&(nimm[j]<nimm[k])&&ap[i][j]!=0){ k=j; } } b[k]=0; for(int j=1;j<=n;j++){ if(b[j]==1&&(a[k][j]<nimm[j])&&ap[k][j]!=0){ nimm[j]=a[k][j]; } } } int YHP=0; int num=0; for(int i=1;i<=n;i++){ // cout<<nimm[i]<<" "; if(nimm[i]>=114514){ num++; } YHP+=nimm[i]; } if(num==2) cout<<"orz"; else cout<<YHP; return 0; } ```
by 3ksc03_is_sb @ 2024-07-22 11:30:10


@[3ksc03_is_sb](/user/1079531) ```cpp // Problem: P3366 【模板】最小生成树 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P3366 // Memory Limit: 128 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org) #include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<queue> #include<map> #include<stack> using namespace std; int nimm[5001]; int a[5001][5001]; bool vis[5001]; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++){ int x,y,z; cin>>x>>y>>z; if(a[x][y]==0){ a[x][y]=z; a[y][x]=z; } else{ a[x][y]=min(z,a[x][y]); a[y][x]=min(z,a[y][x]); } } memset(nimm,0x7f,sizeof(nimm)); nimm[1]=0; long long ans=0; for(int i=1;i<=n;i++){ long long k=0; for(int j=1;j<=n;j++) if(!vis[j]&&(nimm[j]<nimm[k])) k=j; if(k==0) return 0&puts("orz"); vis[k]=1;ans+=nimm[k]; // cerr<<k<<' '<<nimm[k]<<endl; for(int j=1;j<=n;j++) if(!vis[j]&&(a[k][j]<nimm[j])&&a[k][j]!=0) nimm[j]=a[k][j]; } int YHP=0; int num=0; for(int i=1;i<=n;i++){ if(nimm[i]==0) num++; YHP+=nimm[i]; } if(num==1) cout<<ans; else cout<<"orz"; return 0; } // https://www.luogu.com.cn/discuss/863149 // b->vis ```
by wwwidk1234 @ 2024-07-22 11:30:31


@[3ksc03_is_sb](/user/1079531) 1. 有点没看懂你后面这一段 `for(int i=1;i<=n;i++){if(nimm[i]==0) num++;YHP+=nimm[i];}` 写的啥 2. 你的i是已选择的边数,`a[i][j]!=0` 错了。 3. 下次建议给代码加点注释,不然可读性太差调代码也麻烦。
by wwwidk1234 @ 2024-07-22 11:32:12


@[3ksc03_is_sb](/user/1079531) 在你第一版基础上改的,第二版没看到。
by wwwidk1234 @ 2024-07-22 11:33:59


谢谢,已关
by 3ksc03_is_sb @ 2024-07-22 11:34:42


@[3ksc03_is_sb](/user/1079531) 后面那段好像可以去掉,试了下如果选出来的 $k=0$ 那么直接判定无解即可。 ~~验证码 CYNO 赛诺 祭~~
by wwwidk1234 @ 2024-07-22 11:35:44


|