• [模板]Kruskal && 并查集 洛谷T3366、3367


    【一年之后重新学习】系列第二弹。。。

    Kruskal:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<ctime>
     6 #include<cstdlib>
     7 
     8 #include<string>
     9 #include<stack>
    10 #include<queue>
    11 #include<vector>
    12 #include<algorithm>
    13 #include<map>
    14 #include<set>
    15 
    16 using namespace std;
    17 
    18 inline void read(int &x){
    19     x=0;
    20     char t=getchar();
    21     bool f=0;
    22     
    23     while(t<'0' || t>'9'){
    24         if(t=='-')f=1;
    25         t=getchar();
    26     }
    27     
    28     while(t>='0' && t<='9'){
    29         x=(x<<3)+(x<<1)+t-'0';
    30         t=getchar();
    31     }
    32     
    33     if(f)x=-x;
    34 }
    35 
    36 void start();
    37 int find(int);
    38 
    39 int pa[5010];
    40 
    41 int u[200010];
    42 int v[200010];
    43 int w[200010];
    44 int first[5010];
    45 int next[200010];
    46 
    47 int p[200010];
    48 
    49 bool cmp(int a,int b){
    50     return w[a]<w[b];
    51 }
    52 
    53 int n,m,i;
    54 int js=0;
    55 int x,y;
    56 int ans=0;
    57 
    58 int main(){
    59     start();
    60     
    61     read(n);read(m);
    62     
    63     for(i=1;i<=n;i++)pa[i]=i;
    64     
    65     for(i=1;i<=m;i++){
    66         read(u[i]);read(v[i]);read(w[i]);
    67         next[i]=first[u[i]];
    68         first[u[i]]=i;
    69         
    70         p[i]=i;
    71     }
    72     
    73     sort(p+1,p+1+m,cmp);
    74     
    75     for(i=1;i<=m && js<n-1;i++){
    76         x=find(u[p[i]]);
    77         y=find(v[p[i]]);
    78         
    79         if(x!=y){
    80             js++;
    81             ans+=w[p[i]];
    82             pa[x]=y;
    83         }
    84     }
    85     
    86     if(js==n-1)printf("%d
    ",ans);else printf("orz
    ");
    87     
    88     return 0;
    89 }
    90 
    91 void start(){
    92     memset(first,0,sizeof(first));
    93     memset(next,0,sizeof(next));
    94 }
    95 
    96 int find(int x){
    97     if(pa[x]==x)return x;
    98     else return pa[x]=find(pa[x]);
    99 }

    并查集:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<ctime>
     6 #include<cstdlib>
     7 
     8 #include<string>
     9 #include<stack>
    10 #include<queue>
    11 #include<vector>
    12 #include<algorithm>
    13 #include<map>
    14 #include<set>
    15 
    16 using namespace std;
    17 
    18 inline void read(int &x){
    19     x=0;
    20     char t=getchar();
    21     bool f=0;
    22     
    23     while(t<'0' || t>'9'){
    24         if(t=='-')f=1;
    25         t=getchar();
    26     }
    27     
    28     while(t>='0' && t<='9'){
    29         x=(x<<3)+(x<<1)+t-'0';
    30         t=getchar();
    31     }
    32     
    33     if(f)x=-x;
    34 }
    35 
    36 int find(int);
    37 
    38 int pa[10010];
    39 int n,m,i,f,a,b,x,y;
    40 
    41 int main(){
    42     read(n);read(m);
    43     
    44     for(i=1;i<=n;i++)pa[i]=i;
    45     for(i=1;i<=m;i++){
    46         read(f);read(a);read(b);
    47         x=find(a);y=find(b);
    48         if(f==1)pa[x]=y;
    49         else{
    50             if(x==y)printf("Y
    ");
    51             else printf("N
    ");
    52         }
    53     }
    54     
    55     return 0;
    56 }
    57 
    58 int find(int x){
    59     if(pa[x]==x)return x;
    60     else return pa[x]=find(pa[x]);
    61 }
  • 相关阅读:
    Object-c学习之路四(oc内存管理autorelease)
    Object-c学习之路三(@class与#import的区别)
    Object-c学习之路二(oc内存管理黄金法则1)
    Object-c学习之路(oc点语法)
    python(学习之路一)
    css中的position属性
    盒子模型——边框(Border)
    CSS盒子模型
    form(表单)标签常用标签及属性
    Codeforces Round #271 (Div. 2) D Flowers【计数dp】
  • 原文地址:https://www.cnblogs.com/running-coder-wfh/p/7517647.html
Copyright © 2020-2023  润新知