求 Hack
查看原帖
求 Hack
564225
dontwannacry楼主2024/4/25 15:34
#include<bits/stdc++.h>
using namespace std;
int N,M,maxre;
bool can[21][21];
long long ANS,dp[524300][19];
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin >> N >> M;maxre = 1<<N;
	for(int i = 1;i <= M;++i){
		int u,v;cin >> u >> v;
		can[u-1][v-1] = can[v-1][u-1] = 1;
	}
	for(int S = 0;S < N;++S){dp[1<<S][S] = 1;}
    for(int re = 1;re < maxre;++re){
        long long val = 0x7fffffffffffffff;
        for(int u = 0;u < N;++u){
            if(((1<<u)&re)==0)continue;
            val = min(val,dp[re][u]);
            if(!dp[re][u])continue;
            for(int v = 0;v < N;++v){
                if(((1<<v)&re)||!can[u][v]) continue;
                dp[re|(1<<v)][v] += dp[re][u];
            }
        }
        ANS += val/2;
    }
    /*
    for(int re = 0;re < maxre;++re){
        for(int u = 0;u < N;++u){
            if(((1<<u)&re)==0)continue;
            cout << u <<" "<< dp[re][u]<<"\n";
        }
        cout << "\n";
    }
    */
    cout << ANS;
	return 0;
}
2024/4/25 15:34
加载中...