【hdu3367】Pseudoforest(伪森林)
http://acm.hdu.edu.cn/showproblem.php?pid=3367
题目大意
伪森林就是一个无向图,这个无向图有多个连通块且每个连通块只有一个简单环。
给你一个无向图,让你找这个图的一个最大生成伪森林(即边权之和最大)。
题解
考虑到用Kruscal算法搞最大生成树时,每次加入一条边之前都必须保证边的这两点在之前属于两个连通块,就是为了防止出现环。
即如果加入的边的两点在一个没有环的连通块里的话,就会出现一个环。
那么我们把Kruscal算法改造一下,如果这条边的两点在同一个没有环的连通块的话,仍然加入这条边,并把这个连通块标记有环。把所有的边都试着加入一遍后就可以得到最终答案。
还要注意如果这条边的两点在不同的连通块,但是两个连通块都有环,那么这条边也不能加。
#include <iostream>
#include <vector>
#include <algorithm>
#define maxn 10005
using namespace std;
int n, m;
namespace djs
{
int parent[maxn];
bool mark[maxn];
void init()
{
for (int i = ; i <= n; i++)
{
parent[i] = -;
mark[i] = false;
}
}
int find(int x)
{
if (parent[x] < )
return x;
else
return parent[x] = find(parent[x]);
}
bool merge(int x, int y)
{
x = find(x);
y = find(y);
if (x != y) // x与y不在一个连通块
{
if (mark[x] && mark[y]) // 两个连通块都有环
return false;
else
{
if (parent[x] > parent[y])
swap(x, y);
parent[x] += parent[y];
parent[y] = x;
mark[x] |= mark[y];
return true;
}
}
else // x与y在一个连通块
{
if(mark[x])
return false;
else // 这个连通块没有环,可以加这条边
{
mark[x] = true;
return true;
}
}
}
}
struct edge
{
int from, to, weight;
};
inline bool cmper(const edge &x, const edge &y) { return x.weight > y.weight; }
vector<edge> edges;
int main()
{
while (true)
{
cin >> n >> m;
if (n == && m == )
return ;
djs::init();
edges.clear();
int a, b, c;
for (int i = ; i <= m; i++)
{
cin >> a >> b >> c;
edges.push_back((edge){a, b, c});
}
sort(edges.begin(), edges.end(), cmper); int ans = ;
for (int i = ; i < edges.size(); i++)
{
if (djs::merge(edges[i].from, edges[i].to))
ans += edges[i].weight;
}
cout << ans << endl;
}
return ;
}
【hdu3367】Pseudoforest(伪森林)的更多相关文章
- hdu3367最大伪森林(并查集)
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3367/ 题目要求一个连通图的最大伪森林,伪森林是一个最多有一个回路的图.我们只要用Kruskal最大生成树的策略 ...
- HDU 3367 (伪森林,克鲁斯卡尔)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=3367 Pseudoforest Time Limit: 10000/5000 MS (Java/Oth ...
- Pseudoforest(伪最大生成树)
Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- HDU3367 Pseudoforest 【并查集】+【贪心】
Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- hdoj--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 (最小生成树)
Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- hdu 3367 Pseudoforest(并查集)
题意:有一种叫作Pseudoforest的结构,表示在无向图上,每一个块中选取至多包含一个环的边的集合,又称“伪森林”.问这个集合中的所有边权之和最大是多少? 分析:如果没有环,那么构造的就是最大生成 ...
- [HDOJ3367]Pseudoforest(并查集,贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3367 求一个无向图上权值最大的伪森林. 伪森林:一个图的连通子图,当且仅当这个子图有且仅有一个环. 既 ...
随机推荐
- 关于php的命名空间
php定义命名空间要使用namespace关键字,例:namespace Database 使用命名空间中的类要使用use关键字,也可以在use后面加as给类取别名,例:use Database\SQ ...
- 0_Simple__asyncAPI
关于CPU - GPU交互的简单接口函数. ▶ 源代码: // includes, system #include <stdio.h> // includes CUDA Runtime # ...
- C#中结构体定义并转换字节数组
最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一 ...
- day2--课前考试题
Linux 系统命令操作语法的格式: 命令 [参数选项] [文件或路径] rm -f ...
- Java中Httpsession是如何实现的?
HTTP协议(http://www.w3.org/Protocols/)是“一次性单向”协议. 服务端不能主动连接客户端,只能被动等待并答复客户端请求.客户端连接服务端,发出一个HTTP Reques ...
- 《Python数据分析常用手册》一、NumPy和Pandas篇
一.常用链接: 1.Python官网:https://www.python.org/ 2.各种库的whl离线安装包:http://www.lfd.uci.edu/~gohlke/pythonlibs/ ...
- C#写的较完美验证码通用类
using System; using System.Collections; using System.ComponentModel; using System.Data; using System ...
- riot.js教程【四】Mixins、HTML内嵌表达式
前文回顾 riot.js教程[三]访问DOM元素.使用jquery.mount输入参数.riotjs标签的生命周期: riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法: riot.j ...
- [转载] NoSQL简介
摘自“百度百科”. NoSQL,泛指非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从 ...
- Hi,腾讯WeTest联合Unity官方打造的性能分析工具UPA,今日全新发布!
早在2016年ChinaJoy开始,WeTest曾受邀出席过Unity中国的线下性能场的活动,介绍我们的自动化框架和王者荣耀的故事.当时的活动很成功,期间我们收到了不少Unity开发者的好评,也为我们 ...