O

来源:互联网 发布:火箭队球迷 知乎 编辑:程序博客网 时间:2024/06/07 19:12

One day , Partychen gets several beads , he wants to make these beads a necklace . But not every beads can link to each other, every bead should link to some particular bead(s). Now , Partychen wants to know how many kinds of necklace he can make.
Input
It consists of multi-case . 
Every case start with two integers N,M ( 1<=N<=18,M<=N*N ) 
The followed M lines contains two integers a,b ( 1<=a,b<=N ) which means the ath bead and the bth bead are able to be linked. 
Output
An integer , which means the number of kinds that the necklace could be.
Sample Input
3 31 21 32 3
Sample Output
2

题意:

给你几个贝壳,每个贝壳能和特定的贝壳相连,问最多可组成多少种项链?

思路:

状态dp,寻找每个位置

代码;'

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>typedef __int64 ll;using namespace std;int n,m;bool mp[25][25];ll dp[1<<18][25];void solve(){    int bit=1<<n;    memset(dp,0,sizeof(dp));    dp[1][0]=1;    for(int i=1;i<bit;++i){        for(int j=0;j<n;j++){            if(dp[i][j]==0)continue;            for(int k=1;k<n;k++){                if(i&(1<<k))continue;                if(!mp[j][k])continue;                dp[i|(1<<k)][k]+=dp[i][j];            }        }    }    ll ans=0;    for(int i=0;i<n;i++)        if(mp[0][i])ans+=dp[bit-1][i];    cout<<ans<<endl;}int main(){    ios::sync_with_stdio(false);    int x,y;    int i;    while(cin>>n>>m){            memset(mp,0,sizeof(mp));    for(i=0;i<m;i++){        cin>>x>>y;        --x,--y;        mp[x][y]=mp[y][x]=1;    }    solve();    }    return 0;}


原创粉丝点击