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(伪森林)的更多相关文章

  1. hdu3367最大伪森林(并查集)

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3367/ 题目要求一个连通图的最大伪森林,伪森林是一个最多有一个回路的图.我们只要用Kruskal最大生成树的策略 ...

  2. HDU 3367 (伪森林,克鲁斯卡尔)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=3367 Pseudoforest Time Limit: 10000/5000 MS (Java/Oth ...

  3. Pseudoforest(伪最大生成树)

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...

  4. HDU3367 Pseudoforest 【并查集】+【贪心】

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  5. hdoj--3367--Pseudoforest(伪森林&&最大生成树)

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  6. hdu 3367(Pseudoforest ) (最大生成树)

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  7. hdu 3367 Pseudoforest (最小生成树)

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  8. hdu 3367 Pseudoforest(并查集)

    题意:有一种叫作Pseudoforest的结构,表示在无向图上,每一个块中选取至多包含一个环的边的集合,又称“伪森林”.问这个集合中的所有边权之和最大是多少? 分析:如果没有环,那么构造的就是最大生成 ...

  9. [HDOJ3367]Pseudoforest(并查集,贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3367 求一个无向图上权值最大的伪森林. 伪森林:一个图的连通子图,当且仅当这个子图有且仅有一个环. 既 ...

随机推荐

  1. Internal类

    C#中一个类中的成员有四种修饰级别: public:完全开放,谁都能访问. private:完全封闭,只有类自身可以访问. internal:只对相同程序集,或使用InternalVisibleToA ...

  2. C++头文件的处理

    C++的头文件比自己想的要复杂,不是简单地添加自己需要的头文件,这当中有一定的规律.简单归于以下几点: 1.非stadfx.h的头文件必须要有#pragma once的编译提示符,具体原因也不明白. ...

  3. Android 开发笔记___Application操作全局变量

    只要app在运行中,他就是一个application.因此可以用它来保存一些全局变量 package com.example.alimjan.hello_world; import android.a ...

  4. Android 开发笔记___switch__开关

    default switch <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

  5. 实用 .htaccess 用法大全【转载】

    转载:http://www.techug.com/htaccess-snippets 这里收集的是各种实用的 .htaccess 代码片段,你能想到的用法几乎全在这里. 免责声明: 虽然将这些代码片段 ...

  6. Clipboard 剪辑板

    ie是最早支持剪辑板相关事件(并且允许javascript接入)的浏览器(鼠标右键复制)   相关事件: beforecopy— Fires just before the copy operatio ...

  7. 脚本检测 media query 分界点

    当需要为不同屏幕大小添加不同脚本的时候,首先需要检测对应的media query 是否起效 也就是CSS( @screen only and (min-width: 40em) {})和javascr ...

  8. 利用 bat 批量处理命令实现手动控制mysql /Oracle 服务的开启和关闭

    利用 bat 批量处理命令实现手动控制mysql /Oracle 服务的开启和关闭 因为最近在学习数据库的知识,主要学习的是oracle 数据库,然而好巧啊,java也是在学习,我们老师现在要我们做一 ...

  9. 《项目架构那点儿事》——浅析web层struts2的构建

    [前言]所谓快速开发,实质上为了节省项目的开支成本,减少程序员的开发时 间,固然就形成了种种二次封装的框架,也就是造轮子,然后我们的程序就按照这个轮子去画瓢,这里我就把公司这几次开发系统的框架源码贴出 ...

  10. openstack学习心得:glance 架构、概念、后端存储配置方式

    glance 架构 glance 服务概述 Image 服务 使得用户可以发现.注册.检索虚拟机镜像.它对外提供REST API使得你能够查询虚拟机镜像元数据和检索一个真实的镜像.你可以通过镜像服务将 ...