2021.8.25北中暑训
上午,讲了最小生成树
复习了一下最小生成树的算法
做了一点例题
prim做法
#include<bits/stdc++.h> using namespace std; int n,l[5001][5001],m,d[100001],minn,i,j,z,x,y,c,k,sl; int main() { scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&c); if(c<l[x][y]||l[x][y]==0) { l[x][y]=c; l[y][x]=c; } } memset(d,999999,sizeof(d)); d[1]=0; for(i=2;i<=n;i++) { if(l[1][i]>0) { d[i]=l[1][i]; } } for(i=1;i<n;i++) { minn=999999; k=0; for(j=1;j<=n;j++) { if(d[j]>0&&d[j]<minn) { minn=d[j]; sl++; k=j; } } d[k]=0; z+=minn; for(j=1;j<=n;j++) { if(d[j]>0&&l[k][j]<d[j]&&l[k][j]>0) { d[j]=l[k][j]; } } } if(sl<n-1) { printf("orz"); return 0; } printf("%d",z); return 0; }
克鲁斯卡尔做法
#include<bits/stdc++.h> using namespace std; struct node{ int z,u,v; }c[1000001]; int n,m,f[5001],jl,ans; inline bool cmp(const node &x,const node &y) { return x.z>y.z; } inline int gf(register int x) { if(f[x]!=x) { return f[x]=gf(f[x]); } return x; } int main() { scanf("%d%d",&n,&m); for(register int i=1;i<=n;++i) { f[i]=i; } for(register int i=1;i<=m;++i) { scanf("%d%d%d",&c[i].u,&c[i].v,&c[i].z); } sort(c+1,c+m+1,cmp); while(jl<n-1&&m>0) { register int x,y; x=gf(c[m].u); y=gf(c[m].v); if(x!=y) { jl++; ans+=c[m].z; f[y]=x; } m--; } if(jl<n-1) { printf("orz"); return 0; } printf("%d",ans); return 0; }
下午,做了2015年普及组初赛题
做了提高组的题之后再做普及组的,确实感觉不一样哈
拿了90分,还不错吧

浙公网安备 33010602011771号