HDU - Pseudoforest
Description
Input
The last test case is followed by a line containing two zeros, which means the end of the input.
Output
Sample Input
0 1 1
1 2 1
2 0 1
4 5
0 1 1
1 2 1
2 3 1
3 0 1
0 2 2
0 0
Sample Output
5
- #include<cstdio>
- #include<cstring>
- #include<queue>
- #include<cmath>
- #include<algorithm>
- #include<string>
- #include<iostream>
- using namespace std;
- const int MX = 111111;
- int road[MX];
- int sign[MX];
- int rec[MX];
- int n, m;
- struct Node {
- int a, b, c;
- }node[MX];
- bool comp(const Node& n1, const Node& n2) {
- return n1.c > n2.c;//对价值进行排序,优先考虑放大的,贪心啦
- }
- void ini() {
- for (int i = 0; i < n; i++) {
- road[i] = i;
- sign[i] = 0;//注意这个是用来标记环的数量的
- rec[i] = 1;//注意这个是用来标记集合中的元素个数的,因为我采用了新的合并方法,就是把小集合合并到大集合,当然你也不用在意这种细节啦,你可以继续使用自己的合并方式
- }
- }
- int FindRoot(int r) {//在使用路径压缩查找跟节点的时候我没有使用递归了,主要是不好进行各种标记
- int root = r;
- while (road[root] != root) root = road[root];
- int t1 = r;
- int t2 = r;
- while (road[t1] != root) {
- t2 = road[t1];
- road[t1] = root;
- sign[t1] = sign[root];
- t1 = t2;
- }
- return root;
- }
- int UnionRoot(int root1, int root2) {//基本的合并,一看就懂啦,看不懂就继续看- -
- if (rec[root1] >= rec[root2]) {
- road[root2] = root1;
- rec[root1]++;
- return root1;
- } else {
- road[root1] = root2;
- rec[root2]++;
- return root2;
- }
- }
- int main()
- {
- //freopen("input.txt", "r", stdin);
- while (scanf("%d%d", &n, &m), n || m) {
- ini();
- for (int i = 0; i < m; i++) {
- scanf("%d%d%d", &node[i].a, &node[i].b, &node[i].c);
- }
- sort(node, node + m, comp);//基本的贪心思想
- int ans = 0;
- for (int i = 0; i < m; i++) {
- int root1 = FindRoot(node[i].a);
- int root2 = FindRoot(node[i].b);
- if (root1 == root2 && sign[root1] == 0) {//当两个节点同属于一个集合的时候,看看这个集合已经形成环了没有,如果形成了,就不能加入了,反之则可以
- ans += node[i].c;
- sign[root1] = 1;
- } else {
- if (sign[root1] != 1 || sign[root2] != 1) {//两个节点分别属于不同的集合,因为合并的时候要考虑环的数量,所以当两个集合合并后新集合的环数量超过1也是不行的
- ans += node[i].c;
- int r = UnionRoot(root1, root2);
- if (sign[root1] == 1 || sign[root2] == 1) {
- sign[r] = 1;
- }
- }
- }
- }
- printf("%d\n", ans);
- }
- return 0;
- }
HDU - Pseudoforest的更多相关文章
- hdu 3367(Pseudoforest ) (最大生成树)
Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- hdu 3367 Pseudoforest (最大生成树 最多存在一个环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3367 Pseudoforest Time Limit: 10000/5000 MS (Java/Oth ...
- hdu 3367 Pseudoforest(最大生成树)
Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- hdu 3367 Pseudoforest
Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- hdu 3367 Pseudoforest (最小生成树)
Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- HDU 3367 Pseudoforest(Kruskal)
Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- hdu 3367 Pseudoforest(并查集)
题意:有一种叫作Pseudoforest的结构,表示在无向图上,每一个块中选取至多包含一个环的边的集合,又称“伪森林”.问这个集合中的所有边权之和最大是多少? 分析:如果没有环,那么构造的就是最大生成 ...
- hdu 3367 Pseudoforest 最大生成树★
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
随机推荐
- 【转载】 JQuery.Gantt(甘特图) 开发指南
转载来自: http://www.cnblogs.com/liusuqi/archive/2013/06/09/3129293.html JQuery.Gantt是一个开源的基于JQuery库的用于实 ...
- ArcGIS中的三种查询
ArcGIS runtime SDK for WPF/Silverlight中的三种常用的查询:QueryTask.FindTask.IdentifyTask都是继承自ESRI.ArcGIS.Clie ...
- Creating a Table View Programmatically
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/Cre ...
- PHPCMS V9 点击量排行调用方法
首先调用的标签代码如下: {pc:content action=”sitehits” siteid=”4″ num=”10″ order=”views DESC” cache=”3600″} {loo ...
- WPF程序最小化到任务通知栏
我们通常使用的桌面软件,都可以最小化到任务通知栏,并且可以从任务通知栏再打开当前软件,或者通过软件的快捷方式从任务通知栏呼出. 我们可以通过下面的方式把WPF程序最小化到任务栏.由于WPF并没有实现N ...
- 如何设计一个优秀的API(转)
到目前为止,已经负责API接近两年了,这两年中发现现有的API存在的问题越来越多,但很多API一旦发布后就不再能修改了,即时升级和维护是必须的.一旦API发生变化,就可能对相关的调用者带来巨大的代价, ...
- 批量删除SharePoint 2010的List中的item
第一种方式:循环遍历List中的所有item,然后根据条件去判断当前item是否应该被删除[注:要用 i-- 方式去遍历,这也是删除集合里面item的常用做法,如果用 i++ 的方式去遍历删除,会出错 ...
- System.Web.Caching.Cache类 缓存
1.文件缓存依赖 public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender ...
- 【java 断点续传】
模拟 断点续传 首先,先读取word文件的 一部分 package com.sxd.readLines; import java.io.File; import java.io.FileInputSt ...
- 【SQL 触发器】
一.MySQL上触发器的使用 示例: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW t ...