Skip to content

Commit aab147a

Browse files
committed
hamilton
1 parent e40387f commit aab147a

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed

Graph/Hamilton Path.cpp

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
#include<bits/stdc++.h>
2+
#include<ext/pb_ds/assoc_container.hpp>
3+
#include<ext/pb_ds/tree_policy.hpp>
4+
#define FIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
5+
#define Fileio freopen("output.txt","w",stdout);freopen("input.txt","r",stdin);
6+
#define all(v) v.begin(),v.end()
7+
#define rall(v) v.rbegin(),v.rend()
8+
#define MEM(a,x) memset(a,x,sizeof(a))
9+
#define SZ(v) v.size()
10+
#define nl "\n"
11+
#define bug cout<<"bug"<<nl;
12+
#define pi acos(-1.0)
13+
#define ll long long
14+
#define pb push_back
15+
#define mp make_pair
16+
#define pii pair< int,int >
17+
#define pll pair< ll,ll >
18+
#define vii vector< int >
19+
#define vll vector< ll >
20+
#define vpi vector< pii >
21+
#define vpl vector<pll>
22+
#define MX 100005
23+
#define EPS 1e-12
24+
#define ss second
25+
#define ff first
26+
using namespace std;
27+
using namespace __gnu_pbds;
28+
29+
template<typename T>
30+
using ordered_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
31+
template<typename T>
32+
using ordered_multiset=tree<T, null_type, less_equal<T>, rb_tree_tag,tree_order_statistics_node_update>;
33+
34+
inline ll powr(int a,int b){ll res=1;while(b){if(b&1) res*=a;a*=a;b/=2;}return res;}
35+
int cases=1;
36+
37+
#ifdef ppqq
38+
#define debug(...) __f(#__VA_ARGS__, __VA_ARGS__)
39+
template < typename Arg1 >
40+
void __f(const char* name, Arg1&& arg1){
41+
cerr << name << " is " << arg1 << std::endl;
42+
}
43+
template < typename Arg1, typename... Args>
44+
void __f(const char* names, Arg1&& arg1, Args&&... args){
45+
const char* comma = strchr(names+1, ',');
46+
cerr.write(names, comma - names) << " is " << arg1 <<" ";
47+
__f(comma+1, args...);
48+
}
49+
#else
50+
#define debug(...)
51+
#endif
52+
53+
///******************************************START******************************************
54+
vii adj[MX];
55+
const ll MOD = (ll) 1e9 + 7;
56+
void countHamiltonPath(int n)
57+
{
58+
//Ref : https://cses.fi/problemset/task/1690
59+
60+
vector<vector<long long>> dp(n+2,vector<long long>((1<<n)+5,0));
61+
dp[0][1]=1;
62+
63+
for(int i=2;i<(1<<n);i++)
64+
{
65+
//only taking subsets which starts with 0
66+
if((i & (1<<0))==0) continue;
67+
68+
for(int start=0;start<n;start++)
69+
{
70+
if((i & (1<<start))==0) continue;
71+
72+
for(auto endd: adj[start])
73+
{
74+
int prev=i^(1<<endd);
75+
if(i & (1<<endd))
76+
{
77+
dp[endd][i]+=dp[start][prev];
78+
dp[endd][i]%=MOD;
79+
}
80+
}
81+
}
82+
}
83+
cout<<dp[n-1][(1<<n)-1];
84+
}
85+
int main()
86+
{
87+
FIO;
88+
int n,m;
89+
cin>>n>>m;
90+
for(int i=0;i<m;i++)
91+
{
92+
int u,v;
93+
cin>>u>>v;
94+
u--;v--;
95+
adj[u].pb(v);
96+
adj[v].pb(u);
97+
}
98+
countHamiltonPath(n);
99+
}

0 commit comments

Comments
 (0)