Codeforces Beta Round #11 D. A Simple Task

来源:互联网 发布:克劳福德数据 编辑:程序博客网 时间:2024/05/14 19:23
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
0 0