hdu 3367 Pseudoforest (最大生成树 最多存在一个环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3367
Pseudoforest
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2870 Accepted Submission(s): 1126
The last test case is followed by a line containing two zeros, which means the end of the input.
题目大意:在一个无向图中,给定一些边的联通情况以及边的权值,求最大生成树(最多存在一条环路)。
解题思路:用kruskal的方法按照求最大生成树那样求的,只不过要加一个判断,就是判断两颗子树是够成环,
如果各成环,就不能合并,如果只有其中一个成环或者都不成环,那么就可以合并,并对其进行标记。。。
AC代码:
20041234 2017-03-08 16:17:45 Accepted 3367 546MS 2668K 1272 B G++ #include <stdio.h>
#include <string.h>
#include <algorithm> using namespace std; struct point
{
int u,v,l;
}p[];
int parent[],n,m,vis[]; // vis数组用来标记是否形成环
bool cmp(point a, point b)
{
return a.l > b.l; // 从大到小排列
} int find (int x)
{
int s,tmp;
for (s = x; parent[s] >= ; s = parent[s]);
while (s != x)
{
tmp = parent[x];
parent[x] = s;
x = tmp;
}
return s;
}
void Union(int A, int B)
{
int a = find(A), b = find(B);
int tmp = parent[a]+parent[b];
if (parent[a] < parent[b])
{
parent[b] = a;
parent[a] = tmp;
}
else
{
parent[a] = b;
parent[b] = tmp;
}
}
int kruskal()
{
int sum = ,max = ;
sort(p,p+m,cmp);
memset(vis,,sizeof(vis));
memset(parent,-,sizeof(parent));
for (int i = ; i < m; i ++)
{
int u = find(p[i].u), v = find(p[i].v);
if (u != v)
{
if (vis[u] && vis[v]) continue; // 如果两棵子树,各自能够形成一个环,则不合并
if (vis[u] || vis[v]) // 如果只有其中一个形成环,或者两个都没形成环,合并同时标记
vis[u] = vis[v] = ;
max += p[i].l;
Union(u,v);
}
else if(!vis[u] || !vis[v]) // 在同一连通分量内且有一个或者两个都没形成环 合并且标记
{
vis[u] = vis[v] = ;
max += p[i].l;
Union(u,v);
}
}
return max;
}
int main ()
{
while (scanf("%d%d",&n,&m),n+m!=)
{
for (int i = ; i < m; i ++)
scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].l);
printf("%d\n",kruskal());
}
return ;
}
hdu 3367 Pseudoforest (最大生成树 最多存在一个环)的更多相关文章
- hdu 3367 Pseudoforest(最大生成树)
Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- hdu 3367 Pseudoforest 最大生成树★
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> ...
- hdu 3367(与最大生成树无关。无关。无关。重要的事情说三遍+kruskal变形)
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 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- hdu 3367 Pseudoforest(并查集)
题意:有一种叫作Pseudoforest的结构,表示在无向图上,每一个块中选取至多包含一个环的边的集合,又称“伪森林”.问这个集合中的所有边权之和最大是多少? 分析:如果没有环,那么构造的就是最大生成 ...
- 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 (伪森林,克鲁斯卡尔)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=3367 Pseudoforest Time Limit: 10000/5000 MS (Java/Oth ...
随机推荐
- python lambda匿名函数 用法
语法 lambda argument_list: expression argument_list是参数列表 expression是一个关于参数的表达式.表达式中出现的参数需要在argument_li ...
- struts2后台向前台传值为空
今天遇到了一个bug,在后台定义了一个list,然后在前台展示,结果前台接手到的一直是个空,然后找了半天最后才知道是名字名字的问题,这个变量是第一个字母小写,然后第二个字母大写了,然后自动生成的get ...
- 为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比
原文:https://www.sojson.com/blog/48.html 前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道.以管道的方式做消息传递. 场景: ...
- 用selenium工具做软件自动化测试的面试题及答案
1.selenium中如何判断元素是否存在? 答:isElementPresent 2.selenium中hidden或者是display = none的元素是否可以定位到? 答:不可以定位到 3.s ...
- c#操作mysql
using System; using MySql.Data; using MySql.Data.MySqlClient; using System.Data; using System.Linq; ...
- vue html页面打印功能vue-print
vue项目中,HTML页面打印功能.在项目中,有时需要打印页面的表格, 在网上找了一个打印组件vue-print-nb 使用方式 安装 npm install vue-print-nb --save ...
- RabbitMQ 很成熟 不是阿里的
简介 官网 http://www.rabbitmq.com RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现 RabbitMQ实现了AMQ ...
- sql 获取当天开始时间 结束时间
2010-06-21 00:00:00.000 SELECT dateadd(ms,0,DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)) 2010-06-21 23: ...
- Python数据类型(字典)
文章内容参考了教程:http://www.runoob.com/python/python-basic-syntax.html#commentform Python 字典(Dictionary) 字典 ...
- PHP读取文件的多种方法
1.传统的方法 fopen, fclose feof:file.end of file 例子: $file_handle = fopen("c:\\myfile.txt", &qu ...