本鶸鸡于本月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 }
View Code

相关文章: