zoukankan      html  css  js  c++  java
  • 最小生成树 HDU 各种畅通工程的题,prim和kru的模板题

    hdu 1879 继续畅通工程  克鲁斯
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 typedef struct node
     5 {
     6     int u,v,w;
     7 }edge;
     8 edge e[10005];
     9 int dg[105];
    10 void init(int n)
    11 {
    12     int i;
    13     for(i = 1;i <=n ;i++)
    14     dg[i] = i;
    15 }
    16 int cmp(const void *a,const void *b)
    17 {
    18     return (*(struct node *)a).w-(*(struct node *)b).w;
    19 }
    20 int find(int x)
    21 {
    22     if(x != dg[x])
    23     {
    24         dg[x] = find(dg[x]);
    25     }
    26     return dg[x];
    27 }
    28 
    29 int main()
    30 {
    31     int n,i,j,leap,ans,u,v;
    32     while(scanf("%d",&n)&&n)
    33     {
    34         int t = n*(n-1)/2;
    35         ans = 0;
    36         for(i = 1;i <= t;i++){
    37             scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].w,&leap);
    38             if(leap)
    39             e[i].w = 0;
    40         }
    41 
    42         qsort(e+1,t,sizeof(edge),cmp);
    43         init(n);
    44 
    45         for(i = 1;i <= t;i++)
    46         {
    47             u = find(e[i].u);
    48             v = find(e[i].v);
    49             if(u != v)
    50             {
    51                 dg[u] = v;
    52                 ans += e[i].w;
    53             }//到这里就卡主了= =。。。
    54         }
    55         printf("%d\n",ans);
    56     }
    57     return 0;
    58 }
    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 typedef struct node
     5 {
     6     int u,v,w;
     7 }edge;
     8 edge e[10005];
     9 int dg[105];
    10 void init(int n)
    11 {
    12     int i;
    13     for(i = 1;i <=n ;i++)
    14     dg[i] = i;
    15 }
    16 int cmp(const void *a,const void *b)
    17 {
    18     return (*(struct node *)a).w-(*(struct node *)b).w;
    19 }
    20 int find(int x)
    21 {
    22     if(x != dg[x])
    23     {
    24         dg[x] = find(dg[x]);
    25     }
    26     return dg[x];
    27 }
    28 
    29 int main()
    30 {
    31     int n,i,j,leap,ans,u,v;
    32     while(scanf("%d",&n)&&n)
    33     {
    34         int t = n*(n-1)/2;
    35         ans = 0;
    36         for(i = 1;i <= t;i++){
    37             scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].w,&leap);
    38             if(leap)
    39             e[i].w = 0;
    40         }
    41 
    42         qsort(e+1,t,sizeof(edge),cmp);
    43         init(n);
    44 
    45         for(i = 1;i <= t;i++)
    46         {
    47             u = find(e[i].u);
    48             v = find(e[i].v);
    49             if(u != v)
    50             {
    51                 dg[u] = v;
    52                 ans += e[i].w;
    53             }
    54         }
    55         printf("%d\n",ans);
    56     }
    57     return 0;
    58 }

    1233 还是畅通工程 prim

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 int map[105][105];
     5 int vis[105];
     6 int d[105];
     7 int prime(int n)
     8 {
     9     int i,j,primer,ans,min;
    10     memset(vis,0,sizeof(vis));
    11     
    12     ans = 0;
    13     for(i = 2;i <= n;i++)
    14     d[i] = map[1][i];
    15     vis[1] = 1;
    16 
    17     for(i = 1;i < n;i++)
    18     {
    19         min = 0x7fffffff;
    20         for(j = 2;j <= n;j++)
    21         {
    22             if(min > d[j]&& !vis[j])
    23             min = d[j],primer = j;
    24         }
    25         ans += min;
    26         vis[primer] = 1;
    27         for(j = 2;j <= n;j++)
    28         if(d[j] > map[primer][j] && !vis[j])
    29         d[j] = map[primer][j];
    30     }
    31     return ans;
    32 }
    33 int main()
    34 {
    35     int n,w,i,j,leap,ans,u,v;
    36     while(scanf("%d",&n)&&n)
    37     {
    38         int t = n*(n-1)/2;
    39         ans = 0;
    40 
    41         for(i = 1;i <= n;i++)
    42             for(j = 1;j <= n;j++)
    43             map[i][j] = 0x7fffffff;
    44 
    45         for(j = 1;j <= n;j++)
    46         map[j][j] = 0;
    47 
    48         for(i = 1;i <= t;i++){
    49             scanf("%d%d%d",&u,&v,&w);
    50             if(map[u][v]>w)
    51             map[u][v] = map[v][u] = w;
    52         }
    53         ans = prime(n);
    54         printf("%d\n",ans);
    55     }
    56     return 0;
    57 }

    kru

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 typedef struct node
     5 {
     6     int u,v,w;
     7 }edge;
     8 edge e[10005];
     9 int set[105];
    10 int cmp(const void *a,const void *b)
    11 {
    12     return (*(struct node*)a).w-(*(struct node*)b).w;
    13 }
    14 int find(int x)
    15 {
    16     if(x != set[x])
    17     set[x] = find(set[x]);
    18 }
    19 void merge(int x,int y)
    20 {
    21     set[x] = y;
    22 }
    23 void init(int n)
    24 {
    25     int i;
    26     for(i = 1;i <= n;i++)
    27     set[i] = i;
    28 }
    29 int main()
    30 {
    31     int n,w,i,j,leap,ans,u,v;
    32     while(scanf("%d",&n)&&n)
    33     {
    34         int t = n*(n-1)/2;
    35         ans = 0;
    36 
    37         for(i = 1;i <= t;i++){
    38             scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
    39         }
    40         qsort(e+1,t,sizeof(edge),cmp);
    41         init(n);
    42 
    43         for(i = 1;i <= t;i++)
    44         {
    45             u = find(e[i].u);
    46             v = find(e[i].v);
    47             if(u != v)
    48             {
    49                 ans += e[i].w;
    50                 merge(u,v);
    51             }
    52         }
    53  
    54         printf("%d\n",ans);
    55     }
    56     return 0;
    57 }

    1863  畅通工程  克鲁斯

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 typedef struct node
     5 {
     6     int u,v,w;
     7 }edge;
     8 edge e[10005];
     9 int set[105];
    10 int cmp(const void *a,const void *b)
    11 {
    12     return (*(struct node*)a).w-(*(struct node*)b).w;
    13 }
    14 int find(int x)
    15 {
    16     if(x != set[x])
    17     set[x] = find(set[x]);
    18 }
    19 void merge(int x,int y)
    20 {
    21     set[x] = y;
    22 }
    23 void init(int n)
    24 {
    25     int i;
    26     for(i = 1;i <= n;i++)
    27     set[i] = i;
    28 }
    29 int main()
    30 {
    31     int n,w,i,j,leap,ans,u,v,m;
    32     while(scanf("%d %d",&n,&m)&&n)
    33     {
    34         init(m);
    35         ans = 0;
    36         for(i = 1;i <= n;i++)
    37         scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);
    38 
    39         qsort(e+1,n,sizeof(edge),cmp);
    40         for(i = 1;i <= n;i++)
    41         {
    42             u = find(e[i].u);
    43             v = find(e[i].v);
    44             if(u != v)
    45             {
    46                 merge(u,v);
    47                 ans += e[i].w;
    48             }
    49         }
    50 
    51         int t;
    52         t = find(1);
    53         leap = 1;
    54         for(i = 2;i <= m;i++)
    55         {
    56             set[i] = find(i);
    57             if(t != set[i])
    58             {
    59                 leap = 0;
    60                 break;
    61             }
    62         }
    63 
    64 
    65 
    66         if(leap)
    67         printf("%d\n",ans);
    68         else
    69         puts("?");
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    一个网络传输框架——zeroMQ 调研笔记
    Node.js的cluster模块——Web后端多进程服务
    boost::spirit unicode 简用记录
    HTTP的长连接和短连接——Node上的测试
    MongoDB 驱动以及分布式集群读取优先级设置
    Lua知识备忘录
    MongoDB使用小结:一些常用操作分享
    此项目与Visual Studio的当前版本不兼容的报错
    @Controller和@RestController的区别
    SQLSERVER中计算某个字段中用分隔符分割的字符的个数
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2625704.html
Copyright © 2011-2022 走看看