codeforce 445B 並查集
DZY loves chemistry, and he enjoys mixing chemicals.
DZY has n chemicals, and m pairs of them will react. He wants to pour these chemicals into a test tube, and he needs to pour them in one by one, in any order.
Let's consider the danger of a test tube. Danger of an empty test tube is 1. And every time when DZY pours a chemical, if there are already one or more chemicals in the test tube that can react with it, the danger of the test tube will be multiplied by 2. Otherwise the danger remains as it is.
Find the maximum possible danger after pouring all the chemicals one by one in optimal order.
The first line contains two space-separated integers n and m .
Each of the next m lines contains two space-separated integers xi and yi (1 ≤ xi < yi ≤ n). These integers mean that the chemical xi will react with the chemical yi. Each pair of chemicals will appear at most once in the input.
Consider all the chemicals numbered from 1 to n in some order.
Print a single integer — the maximum possible danger.
1 0
1
2 1 1 2
2
3 2 1 2 2 3
4
In the first sample, there's only one way to pour, and the danger won't increase.
In the second sample, no matter we pour the 1st chemical first, or pour the 2nd chemical first, the answer is always 2.
In the third sample, there are four ways to achieve the maximum possible danger: 2-1-3, 2-3-1, 1-2-3 and 3-2-1 (that is the numbers of the chemicals in order of pouring).
題目大意:給定一個容器,初始時刻容器的值為1,每放入一個化學藥品若和容器中已有的物品能發生反應則該容器的值乘2,否則的話保持不變。問當所有的化學藥品全部都放入容器完畢後,容器的值為多少。(重複的反應不做累計)
大體思路:
對於所有能夠反應的化學藥品建立在一課樹上,我們放入物品時只要按照一定的順序,就能保證該樹中沒一個節點放入時都能反應一次。
這樣題目就轉化為了,n個化學物品能組成多少棵樹k,那麼就反應n-k次。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int root[53];
int get_root(int x)
{
if(x==root[x])
return x;
return root[x]=get_root(root[x]);
}
int main()
{
int n,m;
long long ans=1;
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
root[i]=i;
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
x=get_root(x);
y=get_root(y);
root[x]=y;
}
int cnt=n;
for(int i=1;i<=n;i++)
{
if(root[i]==i)
cnt--;
}
for(int i=1;i<=cnt;i++)
ans*=2;
printf("%lld\n",ans);
}
return 0;
}
相關文章
- 並查集到帶權並查集並查集
- 【並查集】【帶偏移的並查集】食物鏈並查集
- 並查集(一)並查集的幾種實現並查集
- 3.1並查集並查集
- 並查集(小白)並查集
- 並查集(Union Find)並查集
- 並查集應用並查集
- The Door Problem 並查集並查集
- 並查集練習並查集
- 並查集的使用並查集
- 並查集—應用並查集
- 寫模板, 並查集。並查集
- 並查集跳躍並查集
- 各種並查集並查集
- 食物鏈(並查集)並查集
- 並查集(二)並查集的演算法應用案例上並查集演算法
- The Suspects-並查集(4)並查集
- [leetcode] 並查集(Ⅰ)LeetCode並查集
- [leetcode] 並查集(Ⅱ)LeetCode並查集
- [leetcode] 並查集(Ⅲ)LeetCode並查集
- 並查集演算法並查集演算法
- 並查集深度應用並查集
- 【轉】種類並查集並查集
- 並查集java實現並查集Java
- 並查集-Java實現並查集Java
- 並查集題目合集並查集
- 並查集以及應用並查集
- 並查集的應用並查集
- 暢通工程(並查集)並查集
- (Day3)並查集並查集
- 並查集擴充套件並查集套件
- 簡單易懂的並查集演算法以及並查集實戰演練並查集演算法
- 關於並查集問題並查集
- 並查集的應用2並查集
- 並查集の進階用法並查集
- 並查集(UnionFind)技巧總結並查集
- Wireless Network(並查集(裸))並查集
- 並查集應用總結並查集