题目描述
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。

输入
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。
当N为0时输入结束。
输出
每个测试用例的输出占一行,输出全省畅通需要的最低成本。

样例输入
3
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
0
样例输出
3
1
0

思路:最小生成树(kruskal)
该题是在1004:惠民工程的基础上做了一点变动,这里多了修建状态:1表示已建,0表示未建。
1、如果已建,那么两村庄之间合并不需要成本,并用一个变量vism++统计最小生成树中已修建的道路,代码如下:

if(state==1){  //先合并已修建道路的村庄所在集合,不需要花费 int faU = findFather(u);int faV = findFather(v);if(faU != faV){     //如果不属于同一个集合 father[faU] = faV;  //合并集合(即把测试边增加到最小生成树中) vism++;    //统计最小生成树中已修建的道路 }
}

2、如果未建,将该边加入存储边的数组g[ ]中,用index记录边的总数,代码如下:

g[index].u=u,g[index].v=v,g[index].w=w;
index++;

最后需要注意的是,在方法kruskal()的for循环中,判断是否已完成最小生成树的建立的条件是numEdge==n-1-vism

完整代码如下:

#include<iostream>
#include<algorithm>
using namespace std;struct Edge{int u,v,w;
};const int NV = 101,NE = 4950;   // 顶点数、边数
int n,m,father[NV],index,vism;      //father[NV]表示并查集数组
Edge g[NE];bool cmp(Edge a,Edge b){return a.w<b.w;
} int findFather(int x){    //并查集查询函数 int a = x;while(x != father[x]){    //如果不是根结点,继续循环 x = father[x];   //获得自己的父亲节点 }//  路径压缩 while(a != father[a]){int z = a;a = father[a];father[z] = x;  //此时x表示根结点 }return x;
}
// 适合稀疏图
int kruskal(){int ans = 0,numEdge = 0;for(int i=0;numEdge<n-1-vism && i<index;i++){  //记得减去已修建的道路 int faU = findFather(g[i].u);int faV = findFather(g[i].v);if(faU != faV){     //如果不属于同一个集合 father[faU] = faV;  //合并集合(即把测试边增加到最小生成树中) ans += g[i].w; numEdge++;}}return ans;
}int main(){int u,v,w,state;while(~scanf("%d",&n) && n){  //顶点数,边数 //一开始,每个元素都是一个独立的集合 for(int i=1;i<=n;i++){father[i] = i; //并查集初始化 }m = n*(n-1)/2;vism = 0,index = 0;for(int i=0;i<m;i++){scanf("%d %d %d %d",&u,&v,&w,&state);if(state==1){ //先合并已修建道路的村庄所在集合,不需要花费 int faU = findFather(u);int faV = findFather(v);if(faU != faV){     //如果不属于同一个集合 father[faU] = faV;  //合并集合(即把测试边增加到最小生成树中) vism++;    //统计最小生成树中已修建的道路 }}else{g[index].u=u,g[index].v=v,g[index].w=w;index++;}}sort(g,g+index,cmp);int res = kruskal();printf("%d\n",res);}return 0;
}

1118: 继续畅通工程相关推荐

  1. PIPI OJ 1118: 继续畅通工程(并查集+最小生成树)

    菜鸟生成记(18) 1118: 继续畅通工程 又双叒叕是最短路径的水题;不同的是,在构造最小生成树前,题目中已经规定一些已经建好了(这些边已经在生成树里面了);从未建好的边中选择最优边加入生成树;直到 ...

  2. [kuangbin带你飞]专题六 最小生成树 L - 还是畅通工程 (简单最小生成树)

    L - 还是畅通工程 题目链接:https://vjudge.net/contest/66965#problem/L 题目: 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府&qu ...

  3. 并查集 HDOJ 1232 畅通工程

    题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <c ...

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

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

  5. 【1863】畅通工程 (HDU)

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

  6. HDOJ 1874 HDU 1874 畅通工程续 ACM 1874 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址:          http://acm.hdu.edu.cn/showproblem.php?pid=1874 ...

  7. 畅通工程 HDU - 1233 

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

  8. Kruskal HDOJ 1233 还是畅通工程

    题目传送门 1 /* 2 最小生成树之kruskal算法--并查集(数据结构)实现 3 建立一个结构体,记录两点和它们的距离,依照距离升序排序 4 不连通就累加距离,即为最小生成树的长度 5 */ 6 ...

  9. hdu1879 继续畅通工程 最小生成树

    继续畅通工程 此题明显属于最小生成树的题目 关于最小生成树,有两种方法,一种是Kruskal方法,一种是Prim算法,第一种用并查集即可实现 1 /* 2 hdu1879 3 2013-03-18 1 ...

最新文章

  1. usaco Healthy Holsteins
  2. 第一次写KMP的体会
  3. mingw编译boost_1_66_0
  4. elasticjob2.x 获取上次执行时间_深圳会务公司-会议活动策划与执行注意事项
  5. 启用物料账后,有两种物料价格确定方式
  6. 如何在Dart中合并列表
  7. linux fstream open,fstream创建文件的问题
  8. 了解java虚拟机—非堆相关参数设置(4)
  9. 51Nod-1011 最大公约数GCD【欧几里得算法】
  10. DWR第四篇之对象传参
  11. IOS开发学习----给表视图设置缩进级别
  12. 极客大学架构师训练营 听课总结 - 架构视图,设计文档 -- 第二课
  13. springboot项目+多个启动类部署到linux服务器上
  14. 各位老铁,善财读书会试运营了
  15. 织梦模板建站必须学会的基本代码
  16. 学生计算机编程比赛获奖感言,学生比赛获奖感言4篇
  17. android 8.1评测,[中文字幕]WP8.1版HTC One M8与Android版对比评测
  18. (2)Django---用命令创建项目
  19. Python如何优雅地可视化目标检测框
  20. 通过文献计量学助您发表高影响因子论文—基于Citespace和vosviewer文献计量学可视化SCI论文高效写作方法

热门文章

  1. 四选一单选按钮html实现
  2. 分子生物学总结完整版
  3. 内存对齐是什么?为什么要内存对齐?
  4. Step to UEFI (137) 通过 BGRT 取得当前系统的 LOGO
  5. MySQL忘记密码修改密码
  6. YOLOv3中的非极大值抑制
  7. 【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)
  8. 编程统计候选人的得票数。设有3个候选人zhang、li、wang(候选人姓名不区分大小写),10个选民,选民每次输入一个得票的候选人的名字,若选民输错候选人姓名,则按废票处理。选民投票结束后程序自动显
  9. (已解决)oracle 查询数据一直提示:“error code [17004]; 无效的列类型”
  10. Java、JSP外卖订餐系统