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 ...
随机推荐
- NOI 二分算法练习
1.NOI 二分法求函数的零点 总时间限制: 1000ms 内存限制: 65536kB 描述 有函数: f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * ...
- pycharm直接连接mysql数据库
1.找到view---Tool windows -- Database 2.连接 3.输入地址,账号,密码 4.如果不能使用证明少安装了插件 点击直接安装插件 5.这样就直接能在pycharm中点击刷 ...
- 调整Chrome中文字体为雅黑
几天试了一下Chrom发布的Chrome 37,感觉所谓的Direct2D渲染还是有些效果的,但这只体现在英文上,中文的宋体还是非常的不舒服,便试着将其替换成了雅黑,这里介绍一下相关方法. Chrom ...
- HDU 4635 Strongly connected (2013多校4 1004 有向图的强连通分量)
Strongly connected Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- [HTML/CSS]说说position
目录 语法 作用 使用定位的条件 总结 语法 position : static absolute relative(static.absolute.relative常用值). 参数 static : ...
- sourceinsight常用快捷键
Alt+l 激活语法窗口 ,搜索语法(当前打开文件的函数.宏定义搜索输入区域), Alt+, Alt+. 分别表示后退工作区.前进工作区 shift+F5 标记一个单词 shift ...
- BabyLinux制作过程详解
转:http://www.360doc.com/content/05/0915/14/1429_12641.shtml BabyLinux制作过程详解 作者:GuCuiwen email:win2li ...
- ylbtech-LanguageSamples-OperatorOverLoading(运算符重载)
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-OperatorOverLoading(运算符重载) 1.A,示例(Sample) 返回 ...
- 天台人满为患,不如来看下这个Ramnit蠕虫DesktopLayer.exe分析
今年的世界杯越来越看不懂,想去天台吹吹风都不一定有位置,心凉了,事儿还得做,先从网上抓个可疑样本压压惊!上手分析才发现并没有我想得那么简单…… 一.基本信息 MD5 ff5e1f27193ce51ee ...
- django admin后台接入tinymce并且支持图片上传
首先:下载tinymce 地址是https://www.tinymce.com/ 点击download 下载社区版本即可 接着:把压缩包内tinymce目录内的所有文件和文件夹复制到Django项目中 ...