【最小生成树】【kruscal】hdu4786 Fibonacci Tree

假设这张图能够形成具有k条白边的生成树,

则易证k一定形成一个连续的区间[a,b],中间一定不会断开。要是断开……tm怎么可能。

所以求出a,b就好啦,人家都给你把白边赋成1了,直接跑一下最小生成树,再跑一下最大生成树即可咯。

#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100010
struct Edge{
	int u,v,w;
}edges[N];
bool cmp(const Edge &a,const Edge &b){
	return a.w<b.w;
}
bool cm2(const Edge &a,const Edge &b){
	return a.w>b.w;
}
int T,n,m,a[1010],mm;
int fa[N];
int findroot(int x){
	return x==fa[x] ? x : fa[x]=findroot(fa[x]);
}
int kruscal(){
	for(int i=1;i<=n;++i){
		fa[i]=i;
	}
	int tot=0,sum=0;
	for(int i=1;i<=m;++i){
		int f1=findroot(edges[i].u),f2=findroot(edges[i].v);
		if(f1!=f2){
			fa[f1]=f2;
			++tot;
			sum+=edges[i].w;
			if(tot==n-1){
				return sum;
			}
		}
	}
	return -1;
}
int main(){
//	freopen("f.in","r",stdin);
	scanf("%d",&T);
	a[1]=1; a[2]=2;
	for(int i=3;;++i){
		a[i]=a[i-1]+a[i-2];
		if(a[i]>100000){
			mm=i-1;
			break;
		}
	}
	for(int zu=1;zu<=T;++zu){
		scanf("%d%d",&n,&m);
		for(int i=1;i<=m;++i){
			scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].w);
		}
		sort(edges+1,edges+m+1,cmp);
		int minn=kruscal();
		sort(edges+1,edges+m+1,cm2);
		int maxx=kruscal();
		if(minn==-1 || maxx==-1){
			printf("Case #%d: No\n",zu);
			continue;
		}
		bool flag=0;
		for(int i=1;i<=mm;++i){
			if(a[i]>=minn && a[i]<=maxx){
				flag=1;
				printf("Case #%d: Yes\n",zu);
				break;
			}
		}
		if(!flag){
			printf("Case #%d: No\n",zu);
		}
	}
	return 0;
}
时间: 2024-10-17 15:56:38

【最小生成树】【kruscal】hdu4786 Fibonacci Tree的相关文章

HDU--4786 Fibonacci Tree 生成树+贪心?

N个顶点,M条边,每条边可能为黑色或是白色( 0 or 1 ),问有没有可能用为斐波那契数的数目的白色边构成一棵生成树.所以需要删掉图中的环,根据每次删掉的边有一个白色边的上限和下限,判断一下中间有没有斐波那契数就可以了.实现方法是根据颜色排序,先放黑色边得到的是最小数目的白色边构成的生成树,先放白色边得到是最大数目的白色边构成的生成树. #include<cstring> #include<string> #include<fstream> #include<i

hdu4786 Fibonacci Tree (最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给定图的n个点和m条双向边,告诉你每条边的权值.权值为1表示该边是白边,权值为0表示该边为黑边. 问能否找到一颗生成树,使生成树白边的个数刚好为fibonacci数.如果能构成输出yes,否则输出no. 思路:这里有一个点要知道.因为是0,1 tree.   最小生成树<=生成树的值<=最大生成树.  注意,这个区间的任意一个值都能取到. 但是如果不是0,1 tree,权值就不是任意可

HDU4786 Fibonacci Tree【最小生成树】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4786 题目大意: 给你图的N个点和M条双向边.告诉你每条边的权值.权值为1表示该边是白边,权值为0表示该 边为黑边.问:能否找到一棵生成树,使生成树白边的个数恰好为fibonacci数.如果能构成这样 的fibonacci树,输出Yes,否则输出No. 思路: 先将fibonacci数列打表.然后根据题意构图.然后根据边的权值大小排序,用Kruskal先求一遍 最小生成树,再求一遍最大生成树.如果

HDU 4786 Fibonacci Tree 最小生成树变形

思路: 这题比赛的时候想了好久,最后队友机智的想到了. 不过那时不是我敲的,现在敲的1A. 想好就容易了. 直接把1或者0当做边的权值,然后按边从小到大排序,然后算最小生成用到了几条白边,然后再按边从大到小排序,然后再算白边用了几条.然后最小和最大需要用到的白边都算出来了.如果在这最小最大区间中存在那个啥数列的话就是Yes,否则就是No. 为什么在这区间里面就是对的呢?刚开始我也想了好久,然后发现,因为白边权值是1,然后黑边是0,然后假设用到白边最小的是6,最大的是10,那么,我们可以用黑边去替

hdu 4786 Fibonacci Tree ( 最小生成树 )

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2487    Accepted Submission(s): 796 Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him t

Fibonacci Tree(最小生成树,最大生成树)

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3006    Accepted Submission(s): 966 Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to

hdu 4786 Fibonacci Tree(最小生成树)

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2952    Accepted Submission(s): 947 Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him t

HDOJ 4786 Fibonacci Tree

最大生成树夹最小生成树,老题目了,依稀记得当年在成都靠这题捡了个铜..... Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1572    Accepted Submission(s): 479 Problem Description Coach Pang is interested in Fibonac

Hdoj 4786 Fibonacci Tree 【kruskal】

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2588 Accepted Submission(s): 822 Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do s