这是一道并查集的题目,而且是很简单的并查集的题目。只要具备初等并查集的知识这道题都不是难事。所以这里不讲。
#include<iostream> using namespace std; #include<stdio.h> int pre[55]; int find(int x) { int r=x; while(pre[r]!=r)r=pre[r]; int i=x; int j; while(i!=r) { j=pre[i]; pre[i]=r; i=j; } return r; } int main() { int i,j,m,n; int sum; int k1,k2; __int64 num; while(cin>>n>>m) { sum=0; num=1; for(i=0;i<55;i++)pre[i]=i; for(i=0;i<m;i++) { scanf("%d%d",&k1,&k2); int p1=find(k1); int p2=find(k2); if(p1!=p2) { sum++; pre[p1]=p2; } } for(i=1;i<=sum;i++) num*=2; cout<<num<<endl; } }