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

14 51 2 1011 3 1002 3 22 4 23 4 1

 Sample Output

4

 Source

福州大学第九届程序设计竞赛

解题思路:

一棵树能够有多个最小生成树,可是他们的权值一定是相等的。

按权值从小到大对边排序,然后把权值同样的边归为一组,推断时候,仅仅要一个边的两个端点不在同一个集合,那么该边就能够增加到最小生成树里面。

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=100005;
const int maxm=100005;
int n,m;
int parent[maxn]; struct Node
{
int from,to,w;
}node[maxm]; void init(int n)
{
for(int i=1;i<=n;i++)
parent[i]=i;
} int find(int x)
{
if(parent[x]==x)
return x;
else
return parent[x]=find(parent[x]);
} bool same(int x,int y)
{
return find(x)==find(y);
}
void unite(int x,int y)
{
parent[find(x)]=find(y);
} bool cmp(Node a,Node b)
{
return a.w<b.w;
} void solve()
{
int cnt=0;
int i,j;
for(i=1;i<=m;i=j)
{
for(j=i;node[j].w==node[i].w;j++)//仅仅要同样权值的边两个端点不在同一个集合。该边就一定存在一个最小生成树里面
{
if(!same(node[j].from,node[j].to))
cnt++;
}
for(j=i;node[j].w==node[i].w;j++)//有回路的边加上不影响后面的加边
unite(node[j].from,node[j].to);
}
printf("%d\n",cnt);
} int main()
{
int t;scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init(n);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&node[i].from,&node[i].to,&node[i].w);
sort(node+1,node+1+m,cmp);
solve();
}
return 0;
}

[ACM] FZU 2087 统计数边 (有多少边至少存在一个最小生成树里面)的更多相关文章

  1. FZU 2087 统计树边【MST相关】

     Problem 2087 统计树边 Accept: 212    Submit: 651 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Prob ...

  2. FZU 2087 统计树边

    这题第一直觉就是和CF第三次教育场的E题是一样的, http://codeforces.com/contest/609/problem/E 然后直接拉过来代码改了改,提交返回MLE.FZU内存开的小, ...

  3. COJ 0036 数数happy有多少个?

    数数happy有多少个? 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 图图是个爱动脑子.观察能力很强的好学生.近期他正学英语 ...

  4. [ACM] hdu 1251 统计难题 (字典树)

    统计难题 Problem Description Ignatius近期遇到一个难题,老师交给他非常多单词(仅仅有小写字母组成,不会有反复的单词出现),如今老师要他统计出以某个字符串为前缀的单词数量(单 ...

  5. 数集合有多少个TOJ(2469)

    题目链接:http://acm.tju.edu.cn/toj/showp2469.html 感觉这个题目有点问题,算了不管他了,反正A了. 这里要注意的是求这个集合有多少种,那么就是要剔除重复数后,再 ...

  6. 一张表有三个字段:id(城市id) Cityname(城市名) Privence(所属省份)如果要统计每个省份有多少城市请用SQL实现。

    一张表有三个字段:id(城市id) Cityname(城市名) Privence(所属省份)如果要统计每个省份有多少城市请用SQL实现.

  7. FZU 2231 平行四边形数

    FZU - 2231  平行四边形数 题目大意:给你n个点,求能够组成多少个平行四边形? 首先想到的是判断两对边平行且相等,但这样的话得枚举四个顶点,或者把点转换成边然后再枚举所有边相等的麻烦,还不好 ...

  8. C语言100题集合005-删除一维数组中所有相同的数,使之只剩一个

    系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...

  9. ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】

     FZU 2105  Digits Count Time Limit:10000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

随机推荐

  1. 最简单简洁高效的Json数据解析

    一.无图无真相 二.主要代码 1.导入jar包 拷贝fastjson.jar包到projectlibs包下 2.封装工具类JsonUtil.java package com.example.parse ...

  2. 飘逸的python - __get__ vs __getattr__ vs __getattribute__以及属性的搜索策略

    差别: __getattribute__:是无条件被调用.对不论什么对象的属性訪问时,都会隐式的调用__getattribute__方法,比方调用t.__dict__,事实上运行了t.__getatt ...

  3. Angular 学习笔记——$interpolate

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  4. CCF计算机职业资格认证 2015年3月第2题 数字排序 解法和思路

    问题描写叙述 给定n个整数,请统计出每一个整数出现的次数.按出现次数从多到少的顺序输出. 输入格式 输入的第一行包括一个整数n,表示给定数字的个数. 第二行包括n个整数.相邻的整数之间用一个空格分隔, ...

  5. 运用JS导出ecxel表格、实现文件重命名

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. jquery load方式浏览器断点调试

    jquery load的方式引入的,如果需要在浏览器中断点调试,需要在代码中使用debugger进行断点

  7. Odoo 11 Backend

    Table of Contents 命令入口 服务器 启动server thread 模式 prefork 模式 gevent模式 wsgi 应用 响应 客户端请求 xmlrpc web http路由 ...

  8. springMVC 前后台日期格式传值解决方式之二(共二) @InitBinder的使用

    关于springmvc日期问题的解决方式 除了本博客的[springMVC 前后台日期格式传值解决方式之 @DateTimeFormat的使用和配置]一文, 还有如下这种方式: 在Controller ...

  9. git统计代码行数

    查看个人指定时期内代码行数,注意将 --author="user.name" 替换成自己的用户名 git log --since="2018-07-16" -- ...

  10. web网页按钮如何制作

    1:用矩形形状工具画一个矩形 2 : 加描边 3:三键+N新建图层 前景色变成白色,白色到透明的渐变,选择径向渐变. 4:为了使自然,按住ALT键,使渐变扩大,和矩形保持一直,之后向上调整一些. 5: ...