FZU 2087 统计树边
2016-04-14 11:33
225 查看
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2087
题意:给出一个有n个点m条边的图,没有重边和自环,问有多少条边可以是最少生成树上的边
思路:对Kruscal不熟悉……没有想出来,图上只有2种边,一种是最少生成树上的边,一种不是最少生成树上的边,每次贪心的时候有权值相同且不在同一个集合的边res++,之后将这些边全放进生成树的集合里,最终得到的答案就是所求
题意:给出一个有n个点m条边的图,没有重边和自环,问有多少条边可以是最少生成树上的边
思路:对Kruscal不熟悉……没有想出来,图上只有2种边,一种是最少生成树上的边,一种不是最少生成树上的边,每次贪心的时候有权值相同且不在同一个集合的边res++,之后将这些边全放进生成树的集合里,最终得到的答案就是所求
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define maxn 100030 using namespace std; struct edge { int x,y,w; edge(int x=0,int y=0,int w=0):x(x),y(y),w(w){} }e[maxn]; int fa[maxn]; int n,m; bool cmp(edge p,edge q) { return p.w<q.w; } int finds(int x) { if (x==fa[x]) return x; else return fa[x]=finds(fa[x]); } int Kruscal() { sort(e+1,e+m+1,cmp); int cnt=n; int res=0; for (int i=0;i<=n;i++) fa[i]=i; for (int i=1;i<=m;i++) { int pos=i; while (e[i].w==e[pos].w) { int t1=finds(e[pos].x); int t2=finds(e[pos].y); if (t1!=t2) res++; pos++; } pos=i; while (e[i].w==e[pos].w) { int t1=finds(e[pos].x); int t2=finds(e[pos].y); if (t1!=t2) fa[t1]=t2; pos++; } } return res; } int main() { int t; scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w); } int res=Kruscal(); printf("%d\n",res); } }
相关文章推荐
- 20145335郝昊《java程序设计》第2次实验报告
- 用pil产生验证码出现:ImportError: The _imagingft C module is not installed
- Boost.Optional 的定义与使用
- H3C ISIS
- Hypertable单机安装
- Java验证邮箱有效性和真实性
- Masonry教程--IOS自适配,丢掉Autolayout吧
- 调整文本框的宽度
- canvas知识02:图片放大镜效果
- 基于Python的TCP阻塞式echo服务器
- 存储过程的作用
- android 自定义相机
- 欢迎使用CSDN-markdown编辑器
- skynet学习笔记二
- hypertable编译安装
- Codeforces Round #345 (Div. 2) D. Image Preview __ two pointers and pretreat
- 基于GB28181RTPoverTCP的发送程序拾遗
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- Java基础学习(二)—数组
- 设置Android app的字体不随系统全局字体大小的变动而变动