HDU 5305 Friends(圖+DFS)

Friends 

 有 n 個人,m 組朋友,要求每個人有一半的朋友在線,一半的朋友不在線 ,求多少種可能。

如果一個人有奇數個朋友,顯然是不成立的

若都有偶數個,我們先假設兩種狀態的朋友各有一半,然後借用 m 種關係,使得其成立即可

const int N=100+5;

    int n,m,t;
    int i,j,k;
    int a[N],b[N];
    int num[N];
    Pair G[N];
    int ans;
void DFS(int step)
{
    if(step==m+1){ ans++; return ;}

    int x=G[step].fr,y=G[step].sc;
    if(a[x] && a[y]){ //朋友 x,y在線
        a[x]--;
        a[y]--;
        DFS(step+1);
        a[x]++;
        a[y]++;
    }
    if(b[y] && b[x]){ //朋友 x,y下線
        b[y]--;
        b[x]--;
        DFS(step+1);
        b[x]++;
        b[y]++;
    }
    return ;
}
int main()
{
    IOS;
    rush(){
        cin>>n>>m;
        ms(G,0);
        ms(num,0);
        for(i=1;i<=m;i++){
            cin>>G[i].fr>>G[i].sc;
            num[G[i].fr]++;
            num[G[i].sc]++;
        }
        bool flag=0;
        for(i=1;i<=n;i++){
            a[i]=b[i]=num[i]/2; 
            if(num[i]&1){
                flag=1;
                break;
            }
        }
        if(flag){ cout<<0<<endl; continue; }
        ans=0;
        DFS(1);
        cout<<ans<<endl;
    }
    //PAUSE;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章