FZU 2087 统计树边【MST相关】

Accept: 212 Submit: 651
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
在图论中。树:随意两个顶点间有且仅仅有一条路径的图。
生成树:包括了图中全部顶点的一种树。
最小生成树:对于连通的带权图(连通网)G,其生成树也是带权的。
生成树T各边的权值总和称为该树的权,权最小的生成树称为G的最小生成树(Minimum Spanning Tree)。最小生成树可简记为MST。
可是。对于一个图而言。最小生成树并非唯一的。
如今,给你一个连通的有权无向图,图中不包括有自环和重边,你的任务就是寻找出有多少条边,它至少在一个最小生成树里。图保证连通。
Input
输入数据第一行包括一个整数T,表示測试数据的组数。对于每组測试数据:
第一行包括两个整数n,m(1<n<100000,n-1<m<100000)。接下来m行。每行三个整数a,b,v(1<=a,b<=n,1<v<500),表示第i条路线连接景点A和景点B,距离是V。
两个数字之间用空格隔开。
Output
Sample Input
Sample Output
Source
福州大学第九届程序设计竞赛
思路:用kruskal算法模拟生成树的过程。
同一时候也是一个贪心生成树的过程,我们知道。生成的树的边权值和是一定的。那么对于边的替换的值也是可以确定的:仅仅有权值同样的边才有可能是还有一种生成树方法的边。
然后我就呆萌的记录有多少重边权值的边,然后加上n-1,开开心心的提交,实力WA。
一组数据就能够干掉我:
3 3
1 2 1
1 2 2
2 3 1
所以记得一定不要跟我犯一样的错误,我们须要的是动态推断一条边权值同样的边是否能可能是还有一种生成树方法的边。
我们直接在kruskal算法过程中加上动态推断的成分就能够了。那么要怎样推断呢?遍历每一条边的时候,假设有同样权值的边。像kruskal一样的推断条件,推断这条边是否能增加生成树中就可以。
kruskal算法推断一条边是否可以贪心的增加生成树中:
for(int i=0;i<m;i++)
{
if(find(a[i].x)!=find(a[i].y))
{
zhongquanzhi+=a[i].w;
merge(a[i].x,a[i].y);
}
}
我们对同权值的边推断是否能增加生成树中,而且别忘记对边要进行入树:
for(int i=0;i<m;i=j)
{
for(j=i;a[i].w==a[j].w;j++)
{
if(find(a[j].x)!=find(a[j].y))
{
output++;
}
}
for(j=i;a[i].w==a[j].w;j++)
{
if(find(a[j].x)!=find(a[j].y))
{
merge(a[j].x,a[j].y);
}
}
}
完整的AC代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int f[1000050];
struct path
{
int x,y,w;
}a[100050];
int cmp(path a,path b)
{
return a.w<b.w;
}
int find(int x)
{
return f[x] == x ? x : (f[x] = find(f[x]));
}
void merge(int a,int b)
{
int A,B;
A=find(a);
B=find(b);
if(A!=B)
f[B]=A;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
f[i]=i;
}
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
}
sort(a,a+m,cmp);
int output=0;
int j;
for(int i=0;i<m;i=j)
{
for(j=i;a[i].w==a[j].w;j++)
{
if(find(a[j].x)!=find(a[j].y))
{
output++;
}
}
for(j=i;a[i].w==a[j].w;j++)
{
if(find(a[j].x)!=find(a[j].y))
{
merge(a[j].x,a[j].y);
}
}
}
printf("%d\n",output);
}
}
FZU 2087 统计树边【MST相关】的更多相关文章
- FZU 2087 统计树边
这题第一直觉就是和CF第三次教育场的E题是一样的, http://codeforces.com/contest/609/problem/E 然后直接拉过来代码改了改,提交返回MLE.FZU内存开的小, ...
- [ACM] FZU 2087 统计数边 (有多少边至少存在一个最小生成树里面)
Problem Description 在图论中,树:随意两个顶点间有且仅仅有一条路径的图. 生成树:包括了图中全部顶点的一种树. 最小生成树:对于连通的带权图(连通网)G,其生成树也是带权的. 生成 ...
- BZOJ 1036 树的统计-树链剖分
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...
- 树分治&树链剖分相关题目讨论
预备知识 树分治,树链剖分 poj1741 •一棵有n个节点的树,节点之间的边有长度.方方方想知道,有多少个点对距离不超过m 题解 点分治模板题.详见我早上写的http://www.cnblogs ...
- FZU 2082 过路费 (树链剖分 修改单边权)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 树链剖分模版题,求和,修改单边权. #include <iostream> #include ...
- FZU 2082 过路费(树链剖分)
FZU 2082 过路费 题目链接 树链抛分改动边的模板题 代码: #include <cstdio> #include <cstring> #include <vect ...
- 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]
题目传送门 树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t ...
- luoguP2590 [ZJOI2008]树的统计(树链剖分)
luogu P2590 [ZJOI2008]树的统计 题目 #include<iostream> #include<cstdlib> #include<cstdio> ...
- bzoj1036 树的统计 树链剖分模板
题意:给出树上任意两点,求路径上的值的和与最大值,带单点修改操作 树链剖分思路: 1.对树进行dfs求出点的深度和父亲节点,然后求出轻重儿子(重儿子就是点最多的那个子树,其余都是轻儿子),用一个son ...
随机推荐
- [NOIp2017提高组]小凯的疑惑
题目大意: 给你两个数a,b,保证a与b互质,求最大的x满足不能被表示成若干个a与b的和. 思路: 据说是小学奥数题. 考场上先写了个a*b的60分DP,然后打表发现答案就是(a-1)*(b-1)-1 ...
- Android Broadcast Security(转)
原文地址:http://drops.wooyun.org/tips/4393 0x00 科普 Broadcast Recevier 广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件.很多广 ...
- CentOS更新Python版本,同时修复yum不能使用的问题
转自:Li_Hanx博客 遇到问题,需要更新python,网上找了好多都不能顺利更新,找到这位大佬的这篇博客,写的非常好,分享给大家. 发现一个新办法,那就是直接安装另一个版本的Python,比如Py ...
- Tracing SQL Queries in Real Time for MySQL Databases using WinDbg and Basic Assembler Knowledge
https://www.codeproject.com/Articles/43305/Tracing-SQL-Queries-in-Real-Time-for-MySQL-Databas As ...
- c语言下的变量类型及计算
源码 补码 反码 机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 真值:第一位是符号位,将带符号位的 ...
- C# 中的.pdb/ .vshost.exe/ .vshost.exe.manifest文件
转自 C# 中的.pdb/ .vshost.exe/ .vshost.exe.manifest文件讨论 pdb文件: 英文全称:Program Database File 中文全称:程序数据库 文件 ...
- python接口自动化21-规范的API接口文档示例
前言 接口文档到底长啥样?做接口测试最大的障碍在于没有接口文档,很多公司不注重接口文档的编写,导致测试小伙伴没见过接口文档. 运气好一点的测试小伙伴可能厚着脸皮找开发要过接口文档,然而拿过来的接口文档 ...
- python logging模块用法
http://blog.csdn.net/zyz511919766/article/details/25136485/ import logging logging.debug('debug mess ...
- 把文章里边的html标签去掉(去掉文字的样式,显示css设置的样式)
java: validHeasers.add(tr[0].replace("<(.[^>]*)>",""));//去除HTML标签
- 从外部重置一个运行中consumer group的消费进度
对于0.10.1以上版本的kafka, 如何从外部重置一个运行中的consumer group的进度呢?比如有一个控制台,可以主动重置任意消费组的消费进度重置到12小时之前, 而用户的程序可以保持运行 ...