萌新求调,能帮我看一下为什么dp全是0吗
查看原帖
萌新求调,能帮我看一下为什么dp全是0吗
1302823
sto_DFS_orz楼主2024/8/7 10:00

rt

#include<bits/stdc++.h>
#define ll long long
const ll N=20;
const ll M=600001;
ll n,m,u,v,w,ans;
ll edge[N][N],f[M][N];
using namespace std;
ll res(ll x){
	ll ans=0;
	while(x){
		x>>=1;
		ans++;
	}
	return ans;
}
void put(ll i,ll j,ll k){
	cout<<"( ";
	while(i){
		cout<<res(i&-i)<<' ';
		i-=(i&-i);
	}
	cout<<") ";
	cout<<j+1<<' '<<k+1<<' '<<f[i][j]<<endl;
}
int main(){	
	cin>>n>>m;
	memset(edge,0x3f,sizeof edge);
	for(ll i=1;i<=m;i++){
		cin>>u>>v;
		u--,v--;
		edge[u][v]=1;
		edge[v][u]=1;
	}
	for(ll i=0;i<n;i++)
		f[1<<i][i]=1;
	for(ll i=1;i<=(1<<n);i++){
		for(ll j=0;j<n;j++){
			if(!f[i][j]) continue;
			for(ll k=0;k<n;k++){
				if(!edge[j][k]) continue;
				if((i&-i)>1<<k) continue;
				if(1<<k&i){
					if(1<<k==(i&-i))
						ans+=f[i][j];
				}
				else{
					f[i|(1<<k)][k]+=f[i][j];
				}
				//put(i,j,k);
			}
		}
	}
	cout<<(ans-m)/2;
	return 0;
}
/*
4 6

1 2
1 3
1 4
2 3
2 4
3 4

*/
2024/8/7 10:00
加载中...