HDOJ--4786--Fibonacci Tree【生成树】
生活随笔
收集整理的這篇文章主要介紹了
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【生成树】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 就是好骑!骑ofo小黄蜂和舒畅早晨say
- 下一篇: 【vuejs路由】vuejs 路由基础入