설명 [TITLE]
[洛 谷 P3043 Usaco2012Jan. 소 연합]
( https://www.luogu.org/problemnew/show/P3043 )
[분석]
- 문제의 의미 가장자리도 포인트 m의 수 n 주어진 현재 패킷 가장자리, 단 하나의 그룹에서의 두 지점에 인접한 각 모서리, 그리고 에지 점을 복수의 그룹이지만 포인트들의 세트는 프로그램의 수를 Q 패킷 단독으로 사용할 수도 있고
- 각면의 그룹 중 하나, 그리고 인접한 포인트, 또는 단일 점 : 인기있는 것을 알.
- 각 통신 블록 독립 분석은, 각각의 통신 블록 N 포인트 m 가장자리 분명 $ m> = N-1 $ 구비
- $ m 경우> n 개의 $는 : 독립적 인 에지, 해결책이 있어야합니다
- 링 나무, 이가지 경우 : $ m = n 개의 $하면
- $의 m = N-1 $ 경우 트리 N있다 (즉, 각각 고립 점)
통신 블록을 찾는 방법에 관해서는? 연결되지 않은 세트 ......
[코드]
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
const ll mod=1000000007;
int fa[N],b[N],c[N],n,m,w[N];
ll ans=1;
inline int find(int x){
if(fa[x]==x) return x;
return find(fa[x]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) fa[i]=i,b[i]=1;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
int fu=find(u),fv=find(v);
if(fu!=fv){
fa[fu]=fv;
b[fv]+=b[fu];
b[fu]=0;
c[fv]+=c[fu]+1;
}
else c[fv]++;
}
for(int i=1;i<=n;i++){
if(fa[i]!=i) continue;
if(c[i]>b[i]){
ans=0;
break;
}
if(c[i]==b[i]) ans=ans*2%mod;
if(c[i]==b[i]-1) ans=ans*b[i]%mod;
}
cout<<ans;
return 0;
}