FZU 2087 统计树边
来源:互联网 发布:淘宝手淘搜索一下爆 编辑:程序博客网 时间:2024/06/11 11:08
[题目大意]
给定一个无向图,求出这些边(至少出现在一棵生成树中的边)的数目。
[解题思路]
理解MST的思想,将贪心思想运用。
由小到大遍历这些边,权值相同的为一组。
先判断这些边是否能够成为树边,再对这些边进行合并。
[注意事项]
不知道为何,以前一直写的模板不顶用了...
一定要改成比较丑的样子...
[Code]
#include<iostream>#include<cstdio>#include<algorithm>#define FF(i,N) for( int i=0;i<N;i++ )using namespace std;struct edge{ int u,v,len;}E[111111];int n,m;int fat[111111];int getf( int x ){ if( fat[x]==x ) return x; else return fat[x]=getf(fat[x]);}bool cmp( edge a,edge b ){ return a.len<b.len; }int krus(){ sort( E,E+m,cmp ); memset( fat,0,sizeof(fat) ); for( int i=0;i<=n;i++ ) fat[i]=i; int ret=0,pre=-1; for( int i=0;i<=m;i++ ) { if( pre!=-1&&E[pre].len!=E[i].len ) { for( int j=pre;j<i;j++ ) if( getf(E[j].u)!=getf(E[j].v) ) ret++; for( int j=pre;j<i;j++ ) fat[getf(E[j].u)]=getf(E[j].v); //fat[fat[(E[j].u]]=fat[E[j].v]; pre=-1; } if( pre==-1 ) pre=i;}return ret;}int main(){ int t; scanf("%d",&t); while( t-- ) { scanf( "%d %d",&n,&m ); E[m].len=INT_MAX; FF(i,m) scanf( "%d%d%d",&E[i].u,&E[i].v,&E[i].len ); printf( "%d\n",krus() ); } return 0;}
- FZU 2087 统计树边
- FZU - 2087 统计树边
- FZU 2087 统计树边
- FZU 2087 统计树边
- FZU 2087 统计树边
- FZU 2087 统计树边
- FZU 2087 统计树边【MST相关】
- fzu 2087 统计树边 (最小生成树kruskal)
- FZU 2087 统计树边(最小生成树)
- FZU 2087 统计树边 (最小生成树变形)
- FZU 2087 统计树边 Kruskal变形求边的数目
- [ACM] FZU 2087 统计数边 (有多少边至少存在一个最小生成树里面)
- FZU 1587 成绩统计
- FZU 2087 统计树边(最小生成树/找出有多少条边,它至少在一个最小生成树里)
- fzu 2087并查集的运用求最小生成树的等效边
- FZU-1921+线段树
- FZU 2105 线段树
- FZU
- DropDownList下拉框多选
- libgdx 绘制图像
- android应用的loading加载动画制作
- java_正则表达式pattern类Matcher类_(字符串匹配)
- 一个URL编码和解码的C++类
- FZU 2087 统计树边
- 函数的运用
- 关于VS2005通过“添加变量”向导来添加控件变量时出现“控件变量”被禁用的处理办法!
- 程序员面试题--旋转数组中的拐点元素
- C++进行base64编码和解码
- MOSS 2010:Visual Studio 2010开发体验(21)——使用Business Connectivity Service(BCS)集成业务系统
- .vimrc使能鼠标后,vim鼠标右键不能复制
- 解决:org.hibernate.annotationexception no identifier specified for entity
- MyEclipse使用技巧