本鶸鸡于本月10号参加了蔽校的选拔赛,成绩差的死,大部分的题都是赛后花了好长时间才补出来的,其中有些题还是靠QAQorz大佬帮忙才能解决,感谢Qls对我的帮助~接下来就附带上我的暴力题解,大佬们有更好的想法请一定要告诉我啊~
Problem A: 灾区重建
题目链接:http://113.240.233.2:8081/JudgeOnline/problem.php?cid=1015&pid=0
这题求的是最大生成树,我用的是kruskal算法,代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int inf=0x3f3f3f3f; 5 const int maxn=1e6+7; 6 7 int t,n,m; 8 int fa[maxn],r[maxn]; 9 10 struct edge{ 11 int u,v,w; 12 }es[maxn]; 13 14 bool cmp(const edge& e1,const edge& e2){ 15 return e1.w>e2.w; 16 } 17 18 void init(int n){ 19 for(int i=0;i<n;i++){ 20 fa[i]=i; 21 r[i]=0; 22 } 23 } 24 25 int fi(int x){ 26 return fa[x]==x?x:fa[x]=fi(fa[x]); 27 } 28 29 void unite(int x,int y){ 30 int p1=fi(x),p2=fi(y); 31 if(p1==p2) return; 32 if(r[p1]>r[p2]) fa[p2]=p1; 33 else{ 34 fa[p1]=p2; 35 if(r[p1]==r[p2]) r[p2]++; 36 } 37 } 38 39 bool check(int x,int y){ 40 return fi(x)==fi(y); 41 } 42 43 44 int main(){ 45 scanf("%d",&t); 46 for(int k=1;k<=t;k++){ 47 scanf("%d%d",&n,&m); 48 for(int i=0;i<m;i++){ 49 scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].w); 50 } 51 init(n); 52 int ans=inf; 53 sort(es,es+m,cmp); 54 for(int i=0;i<m;i++){ 55 edge e=es[i]; 56 if(!check(e.u,e.v)){ 57 unite(e.u,e.v); 58 ans=min(ans,e.w); 59 } 60 } 61 printf("Case #%d: %d\n",k,ans); 62 } 63 }