zoukankan      html  css  js  c++  java
  • HDU 1233 还是畅通工程

    今天学的最小生成树,先放上这个裸的题。

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1233

    Prim算法

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 int map[110][110],lowcost[110],visit[110];
     4 #define N 1000000
     5 int prim(int maxminum)
     6 {
     7     int i,sum,j,k,min;
     8     for(i=1;i<=maxminum;i++)
     9     {
    10         lowcost[i]=map[1][i];
    11         visit[i]=0;
    12     }
    13     sum=0;
    14     visit[1]=1;
    15     for(i=1;i<=maxminum;i++)
    16     {
    17         min=N;
    18         for(j=1;j<=maxminum;j++)
    19         {
    20             if(visit[j]==0&&lowcost[j]<min)
    21             {
    22                 min=lowcost[j];
    23                 k=j;
    24             }
    25         }
    26         visit[k]=1;
    27         if(min==N)
    28         break;
    29         sum+=min;
    30         for(j=1;j<=maxminum;j++)
    31         {
    32             if(visit[j]==0&&map[k][j]<lowcost[j])
    33             {
    34                 lowcost[j]=map[k][j];
    35             }
    36         }
    37     }
    38     return sum;
    39 }
    40 int main()
    41 {
    42     int maxmax,maxminum,i,a,b,value,sum;
    43     while(~scanf("%d",&maxminum))
    44     {
    45         if(maxminum==0)
    46         break;
    47         memset(map,N,sizeof(map));
    48         maxmax=(maxminum*(maxminum-1))/2;
    49         for(i=1;i<=maxmax;i++)
    50         {
    51             scanf("%d%d%d",&a,&b,&value);
    52             if(value<map[a][b])
    53             {
    54                 map[a][b]=map[b][a]=value;
    55             }
    56         }
    57         sum=prim(maxminum);
    58         printf("%d\n",sum);
    59     }
    60     return 0;
    61 }

    Kruskal算法

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 int map[110],num,sum;
     5 struct node
     6 {
     7     int a;
     8     int b;
     9     int value;
    10 }tax[20000];
    11 int findx(int x)
    12 {
    13     while(x!=map[x])
    14     {
    15         x=map[x];
    16     }
    17     return x;
    18 }
    19 void merge(int x,int y,int z)
    20 {
    21     int tx=findx(x);
    22     int ty=findx(y);
    23     if(tx!=ty)
    24     {
    25         map[tx]=ty;
    26         sum+=z;
    27         num++;
    28     }
    29 }
    30 int cmp(const void *a,const void *b)
    31 {
    32     return(*(node*)a).value>(*(node*)b).value?1:-1;
    33 }
    34 int main()
    35 {
    36     int maxminum,maxmax,i;
    37      while(~scanf("%d",&maxminum))
    38     {
    39         if(maxminum==0)
    40             break;
    41         maxmax=(maxminum*(maxminum-1))/2;
    42         for(i=0;i<=maxminum;i++)
    43             map[i]=i;
    44         for(i=0;i<maxmax;i++)
    45             scanf("%d%d%d",&tax[i].a,&tax[i].b,&tax[i].value);
    46             sum=0;
    47             num=0;
    48         qsort(tax,maxmax,sizeof(tax[0]),cmp);
    49         for(i=0;i<maxmax&&num<maxminum-1;i++)
    50         merge(tax[i].a,tax[i].b,tax[i].value);
    51         printf("%d\n",sum);
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    Docker 部署net5程序
    如何将Docker升级到最新版本
    IntelliJ IDEA修改maven默认仓库地址
    PowerDesigner 导出表结构 到Excel
    gradle加载项目过慢
    linux安装docker配置阿里云镜像
    svn 新建文件不能直接提交终于解决了
    Vs2017 NPM 安装 部署
    MYSQL日期时间字符串互转
    消除svn选定(checkout)桌面上文件显示一大堆问号。
  • 原文地址:https://www.cnblogs.com/timeship/p/2625234.html
Copyright © 2011-2022 走看看