日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDOJ--4786--Fibonacci Tree【生成树】

發布時間:2025/4/5 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDOJ--4786--Fibonacci Tree【生成树】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4786

題意:給出n個點,m條邊,和邊的信息。

邊有兩種顏色,白色和黑色。現要求構造一個生成樹。看是否能滿足白邊的數量是斐波那契數。


這道題比賽的時候,小白想到了一種方法:按邊顏色排序后,先用白邊優先建樹,求出最大白邊最大個數maxm,再用黑邊優先建樹,求出白邊最小個數minm。看這兩個范圍內是否存在斐波那契數。

聽上去感覺還挺有道理,可是不知道怎么證明正確性,后來想想,生成樹構造完之后。再加入隨意一條邊都會產生回路。而產生回路之后就有邊會被替換,而minm是最少的白邊數,也就是minm個白邊是不會被換掉的。maxm同理,所以中間的回路替換掉邊總能保證用白邊替換黑邊,或者黑邊替換白邊。所以能夠這么做。

我信心滿滿的開始敲。然后WA了。。

由于我寫完cmp函數后忘記寫sort了,并且還過了例子。改過之后交一發。還是WA。后來發現數組開了110。。。并且提示是WA不是RE

另外,這道題假設不進行路徑壓縮,會超時

#include<cstring> #include<string> #include<fstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cctype> #include<algorithm> #include<queue> #include<map> #include<set> #include<vector> #include<stack> #include<ctime> #include<cstdlib> #include<functional> #include<cmath> using namespace std; #define PI acos(-1.0) #define MAXN 110000 #define eps 1e-7 #define INF 0x7FFFFFFF #define seed 131 #define ll long long #define ull unsigned ll #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1struct node{int u,v,col; }edge[MAXN]; int father[MAXN],fi[90]; int n,m,flag; bool cmp(node x,node y){return x.col>y.col; } int find(int x){int t = x;while(father[t]!=t){t = father[t];}int k = x;while(k!=t){int temp = father[k];father[k] = t;k = temp;}return t; } void solve(){int i,j=0;int flag2 = 0;int minm,maxm;minm = maxm = 0;sort(edge,edge+m,cmp);for(i=0;i<m;i++){int a = find(edge[i].u);int b = find(edge[i].v);if(a!=b){if(edge[i].col==1) maxm++;father[a] = b;j++;if(j>=n-1){flag2 = 1;break;}}}if(flag2==0){return ;}for(i=1;i<=n;i++){father[i] = i;}j = 0;for(i=m-1;i>=0;i--){int a = find(edge[i].u);int b = find(edge[i].v);if(a!=b){if(edge[i].col==1) minm++;father[a] = b;j++;if(j>=n-1) break;}}//cout<<minm<<" "<<maxm<<endl;for(i=1;i<45;i++){if(fi[i]>=minm&&fi[i]<=maxm){flag = 1;break;}} } int main(){int i,j,k=1,t;int a,b,c;fi[1] = 1;fi[2] = 2;for(i=3;i<45;i++){fi[i] = fi[i-1] + fi[i-2];//cout<<fi[i]<<" "<<i<<" "<<endl;}scanf("%d",&t);while(t--){flag = 0;scanf("%d%d",&n,&m);for(i=1;i<=n;i++) father[i] = i;for(i=0;i<m;i++){scanf("%d%d%d",&a,&b,&c);edge[i].u = a;edge[i].v = b;edge[i].col = c;}solve();if(flag) printf("Case #%d: Yes\n",k++);else printf("Case #%d: No\n",k++);}return 0; }





本文轉自mfrbuaa博客園博客,原文鏈接:http://www.cnblogs.com/mfrbuaa/p/5329523.html,如需轉載請自行聯系原作者? ?

總結

以上是生活随笔為你收集整理的HDOJ--4786--Fibonacci Tree【生成树】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。