typedef long long LL ;
const int maxn = 20 ;
int adj[maxn][maxn] ;
LL dp[1<<maxn][maxn] ;
int main(){
int n , m , i , u , v ; LL sum ;
while(cin>>n>>m){
memset(adj , 0 , sizeof(adj)) ;
for(i = 0 ; i < m ; i++){
scanf("%d%d" , &u , &v) ;
u-- ; v-- ;
adj[u][v] = adj[v][u] = 1 ;
}
memset(dp , 0 , sizeof(dp)) ;
for(i = 0 ; i < n ; i++) dp[1<<i][i] = 1 ;
sum = 0 ;
for(i = 0 ; i < (1<<n) ; i++){
int st = n , cnt = 0 ;
for(int j = 0 ; j < n ; j++){
if(i & (1<<j)){
st = min(st , j) ;
cnt++ ;
}
}
for(int j = 0 ; j < n ; j++){
if(dp[i][j] == 0) continue ;
if(cnt >= 3 && adj[j][st]) sum += dp[i][j] ;
for(int k = 0 ; k < n ; k++){
if(adj[j][k] && (k > st) && ( (i & (1<<k)) == 0) )
dp[i ^ (1<<k)][k] += dp[i][j] ;
}
}
}
cout<< sum / 2 << endl ;
}
return 0 ;
}
简单环,点数>=3
Codeforces Beta Round #11 D. A Simple Task
最新推荐文章于 2022-01-29 15:44:38 发布