2013成都站F題||hdu4786 並查集 生成樹
http://acm.hdu.edu.cn/showproblem.php?pid=4786
Problem Description
Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do some research on Spanning Tree. So Coach Pang decides to solve the following problem:
Consider a bidirectional graph G with N vertices and M edges. All edges are painted into either white or black. Can we find a Spanning Tree with some positive Fibonacci number of white edges?
(Fibonacci number is defined as 1, 2, 3, 5, 8, ... )
Consider a bidirectional graph G with N vertices and M edges. All edges are painted into either white or black. Can we find a Spanning Tree with some positive Fibonacci number of white edges?
(Fibonacci number is defined as 1, 2, 3, 5, 8, ... )
Input
The first line of the input contains an integer T, the number of test cases.
For each test case, the first line contains two integers N(1 <= N <= 105) and M(0 <= M <= 105).
Then M lines follow, each contains three integers u, v (1 <= u,v <= N, u<> v) and c (0 <= c <= 1), indicating an edge between u and v with a color c (1 for white and 0 for black).
For each test case, the first line contains two integers N(1 <= N <= 105) and M(0 <= M <= 105).
Then M lines follow, each contains three integers u, v (1 <= u,v <= N, u<> v) and c (0 <= c <= 1), indicating an edge between u and v with a color c (1 for white and 0 for black).
Output
For each test case, output a line “Case #x: s”. x is the case number and s is either “Yes” or “No” (without quotes) representing the answer to the problem.
Sample Input
2
4 4
1 2 1
2 3 1
3 4 1
1 4 0
5 6
1 2 1
1 3 1
1 4 1
1 5 1
3 5 1
4 2 1
Sample Output
Case #1: Yes
Case #2: No
解題思路:
按邊的顏色排序兩次,一次黑邊優先,利用並查集構造一個生成樹,此時是所有方法中白邊最少的情況,x。而後白邊優先,得出的是白邊最多的情況,y。找找x,y二者之間是否包括一個Fibonacci數即可。
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <algorithm>
//#define debug
using namespace std;
struct note
{
int u,v,c;
} edge[100005];
int n,m,fa[100005],num;
bool cmp1(note a,note b)
{
return a.c<b.c;
}
bool cmp2(note a,note b)
{
return a.c>b.c;
}
void initset()
{
for(int i=0; i<=n; i++)
fa[i]=i;
}
int find(int x)
{
if(x==fa[x])
return x;
return fa[x]=find(fa[x]);
}
int un(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
{
fa[y]=x;
num++;
return 1;
}
return 0;
}
int a[1005];
void fib()
{
a[0]=1;
a[1]=1;
for(int i=2; i<30; i++)
a[i]=a[i-1]+a[i-2];
#ifdef debug
printf("%d\n",a[29]);
#endif // debug
}
int main()
{
int T,tt=0;
scanf("%d",&T);
fib();
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0; i<m; i++)
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].c);
initset();
sort(edge,edge+m,cmp1);
int cnt1;
num=0;
int count=0;
for(int i=0; i<m; i++)
{
if(un(edge[i].u,edge[i].v))
count+=edge[i].c;
if(num==n-1)
{
cnt1=count;
break;
}
}
initset();
sort(edge,edge+m,cmp2);
int cnt2;
num=0;
count=0;
for(int i=0; i<m; i++)
{
if(un(edge[i].u,edge[i].v))
count+=edge[i].c;
if(num==n-1)
{
cnt2=count;
break;
}
}
int flag=0;
for(int i=0; i<29; i++)
if(cnt1==a[i]||cnt2==a[i])
{
printf("Case #%d: Yes\n",++tt);
flag=1;
break;
}
if(flag)
continue;
int x=upper_bound(a,a+29,cnt1)-a;
int y=upper_bound(a,a+29,cnt2)-a;
if(x==y)
printf("Case #%d: No\n",++tt);
else
printf("Case #%d: Yes\n",++tt);
}
return 0;
}
相關文章
- 佈線問題_ny_38(並查集+最小生成樹).java並查集Java
- 樹(tree) - 題解(帶權並查集)並查集
- 並查集題目合集並查集
- 關於並查集問題並查集
- 並查集到帶權並查集並查集
- 2012長春站D題||hdu4424 並查集並查集
- 專題五 並查集【Kuangbin】並查集
- 【並查集】【帶偏移的並查集】食物鏈並查集
- hdu4313 貪心並查集 || 樹形dp並查集
- 並查集(一)並查集的幾種實現並查集
- BZOJ 3673 可持久化並查集 by zky 可持續化線段樹+並查集啟發式合併持久化並查集
- 並查集(小白)並查集
- 3.1並查集並查集
- 【圖論】-橋-並查集(1)題目描述圖論並查集
- 【題解】Solution Set - NOIP2024集訓Day8 並查集和可持久化並查集並查集持久化
- 並查集(Union Find)並查集
- 並查集應用並查集
- The Door Problem 並查集並查集
- 並查集練習並查集
- 並查集的使用並查集
- 並查集—應用並查集
- 寫模板, 並查集。並查集
- 並查集跳躍並查集
- 各種並查集並查集
- 並查集(二)並查集的演算法應用案例上並查集演算法
- [kuangbin帶你飛]專題五 並查集 題解並查集
- 面試常考演算法題之並查集問題面試演算法並查集
- poj 1182 並查集經典問題並查集
- HDU 4496D-City2013通化邀請賽D題(並查集 需要壓縮路徑)並查集
- 2013成都網路賽 兩個簡單題
- The Suspects-並查集(4)並查集
- [leetcode] 並查集(Ⅰ)LeetCode並查集
- [leetcode] 並查集(Ⅱ)LeetCode並查集
- [leetcode] 並查集(Ⅲ)LeetCode並查集
- 並查集演算法並查集演算法
- 並查集深度應用並查集
- 【轉】種類並查集並查集
- 並查集java實現並查集Java