Hamiltonian Flights

hamiltonian path bitmask dp
View Original
Back to Graph Algorithms

Implementation

C++

                                #include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define ll long long
#define pii pair<int,int>
#define endl '\n'
#define mod 1000000007
 
 
int Set(int N,int pos){return N=N | (1<<pos);}
int reset(int N,int pos){return N= N & ~(1<<pos);}
bool check(int N,int pos){return (bool)(N & (1<<pos));}
int popCount(int x){ return __builtin_popcount(x); }
 
/**
 
*/
 
const int N = 22;
const int M = (1<<N)+5;
ll dp[M][N];
 
int adj[N][N];
 
 
void solve(){
 
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int u,v;
        cin>>u>>v;
        u--;v--;
        adj[u][v] += 1;
    }
 
    int up = (1<<(n-1));
    dp[ Set(0,0) ][0] = 1;
    for(int mask=0;mask<up;mask++){
        for(int i=0;i<n-1;i++){
            if( check(mask,i) ) continue;
            for(int j=0;j<n-1;j++){
                if( adj[j][i] == 0 ) continue;
                if( !check(mask,j) ) continue;
                dp[ Set(mask,i) ][i] += (dp[mask][j]*adj[j][i])%mod;
                dp[ Set(mask,i) ][i] %= mod;
            }
        }
    }
    ll res = 0;
    for(int i=0;i<n-1;i++){
        int up = (1<<n)-1;
        up = reset(up,n-1);
        res += dp[up][i]*adj[i][n-1];
        res%=mod;
    }
    cout<<res;
}
 
int main(){
 
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int tc=1;
    //cin>>tc;
 
    for(int i=0;i<tc;i++){
        solve();
    }
}