比赛时题意没读懂,思路对了,并查集,直接搞。
题意就是有N种化学药品,M对能发生化学反应的药品,求最大危险系数。
空试管的危险系数为1,当有一个药品或多个药品发生反应的时候,危险系数乘以2。
直接并查集记录rank就OK了。
#include <stdio.h>
int a[1000], rank[1000];
int find(int x)
{
if(x != a[x])
{
a[x] = find(a[x]);
}
return a[x];
}
void union_set(int x, int y)
{
x = find(x);
y = find(y);
if(x != y)
{
a[x] = y;
rank[y] += rank[x];
rank[x] = 1;
}
}
long long pow(int x)
{
long long temp = 1;
for(int i = 0; i < x; i++)
{
temp *= 2;
}
return temp;
}
int main()
{
int n, m, i;
long long ans;
while(~scanf("%d %d", &n, &m))
{
for(int i = 1; i <= n; i++)
{
a[i] = i;
rank[i] = 1;
}
for(int i = 0; i < m; i++)
{
int x, y;
scanf("%d %d", &x, &y);
union_set(x, y);
}
ans = 1;
for(int i = 1; i <= n; i++)
{
if(rank[i] != 1)
{
ans *= pow(rank[i]-1);
}
}
printf("%I64d\n", ans);
}
return 0;
}