继续畅通工程

此题明显属于最小生成树的题目

关于最小生成树,有两种方法,一种是Kruskal方法,一种是Prim算法,第一种用并查集即可实现

 1 /*
 2 hdu1879
 3 2013-03-18 15:25:50    Accepted    1879    406MS    360K    1188 B
 4 典型的最小生成树,在做并查集时做的这道题,
 5 所以使用并查集实现的克鲁斯卡尔算法
 6 */
 7 #include <iostream>
 8 #include <stdio.h>
 9 #include <algorithm>
10 using namespace std;
11
12 struct node {
13     int start ,end,expense,flag;
14 }data[5005];
15
16 int father[105];
17 void make_set(int n)
18 {
19     for(int i=1;i<=n;i++)
20         father[i]=i;
21 }
22 int find_set(int x)
23 {
24     if(x^father[x])
25         father[x]=find_set(father[x]);
26     return father[x];
27 }
28 int union_set(int x,int y)
29 {
30     x=find_set(x);
31     y=find_set(y);
32     if(x==y)
33         return 0;
34     father[x]=y;
35     return 1;
36 }
37 bool cmp(node a,node b)
38 {
39     return a.expense<b.expense;
40 }
41 int main()
42 {
43     int n;
44     while(scanf("%d",&n)!=EOF)
45     {
46         if(!n)
47             break;
48         make_set(n);
49         int ans=0;
50         int m=(n-1)*n/2;
51         for(int i=0;i<m;i++)
52         {
53             scanf("%d%d%d%d",&data[i].start,&data[i].end,&data[i].expense,&data[i].flag);
54             if(data[i].flag)//当道路修通时,规定一节点为另一节点的父亲
55                 father[data[i].start]=data[i].end;
56         }
57         sort(data,data+m,cmp);//按道路的花费升序排列
58
59         //在不构成环的前提下,选择最短的边,有贪心的思想
60         for(int i=0;i<m;i++)
61         {
62             if(union_set(data[i].start,data[i].end))
63                 ans+=data[i].expense;
64         }
65         printf("%d\n",ans);
66     }
67     return 0;
68 }

第二种则需要开辟一个二维邻接矩阵实现

 1 /*
 2 hdu1879
 3 2013-03-20 17:30:48    Accepted    1879    187MS    324K    1496 B
 4 最小生成树的prim算法,
 5 */
 6 #include <iostream>
 7 #include <stdio.h>
 8 #include <string.h>
 9 using namespace std;
10 int n;
11 int low[110];//存储将要联通的候选边
12 int visited[110];//是否已经并入联通集合
13 int map[110][110];//二维矩阵存储图
14 const int maxn=0x3fffffff;//无穷大
15 int prim()
16 {
17
18     int min;
19     int pos=0,ans=0;
20     memset(visited,0,sizeof(visited));
21     visited[pos]=1;//从第一个点开始联通
22     for(int i=0;i<n;i++)//循环初始化
23     {
24         if(!visited[i])
25         {
26             low[i]=map[pos][i];
27         }
28
29
30     }
31     for(int i=1;i<n;i++)
32     {
33         min=maxn;
34         for(int j=0;j<n;j++)
35         {
36             if(min>low[j]&&!visited[j])
37             {
38                 min=low[j];//找到所有可连通边中的最短边
39                 pos=j;//找到将要并入的下一个点
40
41             }
42         }
43         ans+=min;
44         visited[pos]=1;
45         for(int j=0;j<n;j++)//新点并入后更新最短边候选集合
46         {
47             if(!visited[j]&&map[pos][j]<low[j])
48                 low[j]=map[pos][j];
49         }
50     }
51     return ans;
52 }
53 int main()
54 {
55     while(scanf("%d",&n)!=EOF)
56     {
57          if(!n)break;
58         int a,b,c,d;
59         int m=(n-1)*n/2;
60         for(int i=0;i<m;i++)
61         {
62          scanf("%d%d%d%d",&a,&b,&c,&d);
63          if(d)//若两点已经连通,不需新建道路,花费为零
64          {
65             map[a-1][b-1]=map[b-1][a-1]=0;
66          }
67         else
68              map[a-1][b-1]=map[b-1][a-1]=c;
69
70         }
71         printf("%d\n",prim());
72     }
73     return 0;
74 }

转载于:https://www.cnblogs.com/caoyuanlang/archive/2013/03/20/2971690.html

hdu1879 继续畅通工程 最小生成树相关推荐

  1. hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)

    还是畅通工程                                                                            Time Limit: 4000/2 ...

  2. hdu 1879 继续畅通工程 (最小生成树)

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. HDU 1879 继续畅通工程 最小生成树

    继续畅通工程 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description ...

  4. 还是畅通工程 最小生成树

    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可 ...

  5. HDU 1863畅通工程(最小生成树)(prim算法)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. 畅通工程//最小生成树prim

    题目: 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  7. hdu 1879 继续畅通工程 最小生成树

    继续畅通工程                                                                             Time Limit: 2000/ ...

  8. 题目1017:还是畅通工程(最小生成树初步应用)

    题目链接:http://ac.jobdu.com/problem.php?pid=1017 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  9. HDU 1863 畅通工程 最小生成树

    思路: 比较典型的最小生成树的题目了..在这里用求最小生成树的经典算法K(Kruskal)算法和P(Prim)算法.我的 K 算法用的是结构体来存图,P 算法用的是邻接矩阵来存图,K算法的复杂度是O( ...

最新文章

  1. golang中的互斥锁
  2. css border 制作三角形
  3. Effective Java之考虑用序列化代理代理序列化实例(七十八)
  4. NYU Google: 知识蒸馏无处不在,但它真的有用吗?
  5. 二进制编译安装mysql_二进制编译安装mysql
  6. java高级教程_Java高级教程02
  7. eurekaAutoServiceRegistration 异常
  8. 形容计算机专业好句子,关于形容专业水平高的句子大全 精于专业的名言警句...
  9. fatal error C1010
  10. 51nod 1294 修改数组
  11. fir低通滤波器c语言,大神教你:FIR与IIR低通滤波器的最简最快实现
  12. VUE2.X全教程--基础详解(二)
  13. 计算房租收入比(1)- scrapy 爬取网上租房信息
  14. java文件写入不覆盖_java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法...
  15. android 進度條_Android ProgressBar 反向進度條/進度條從右到左走
  16. 2022年系统集成项目管理工程师考试知识点:典型应用集成技术
  17. 王通:“Hipihi” VS “Second Life”
  18. 掩膜区域内像素值_掩膜(mask)
  19. CF刷题-Codeforces Round #481-F. Mentors
  20. 服务器装完系统无法引导

热门文章

  1. 网络推广——网络推广专员在面对不同阶段网站优化各有妙计
  2. 网站被k不要慌,看看“老油条”们是怎么解决的吧!
  3. 浅析网站建设的基本原则
  4. 网站空间建设并不难,难的是如何做好它!
  5. mysql sql 检测磁盘_MySQL 找到临时表用到磁盘的SQL
  6. 开发日记-20190616 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  7. (传送门)android绘图canvas.clipRect()方法的作用
  8. 下载恶意pcap包的网站汇总
  9. dnscat使用——整体感觉这个工具不完善,失败率很高,传文件时候没有完整性校验,我自己测试时通过域名转发失败,可能是其特征过于明显导致...
  10. 腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...