[온]도 통신 블록] Usaco2012Jan. 소 얼라이언스

설명 [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;
}

추천

출처www.cnblogs.com/JRTQX/p/11067919.html