悬关求调68pts状压
查看原帖
悬关求调68pts状压
1023793
yaodiguoan楼主2024/10/17 19:50

recordrecord

#include <bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
//#pragma GCC optimize(3, "Ofast", "inline")
#define hh putchar('\n')
#define kg putchar(' ')
#define debug puts("debug")
//#define int long long
//#define int __int128
namespace quickread{
	template<typename T> void read(T &x){
		x=0;char c=getchar();T neg=0;
		while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
		while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
		if(neg) x=(~x)+1;
	}
	template<typename T> void write(T x){
		if(x<0) putchar('-'),x=~x+1;
		if(x>9) write(x/10);
		putchar(x%10^48);
	}
}
using namespace quickread;
const int N=22,inf=0x3f3f3f3f;
int n,m,dp[1<<N][N],dis[N][N],ans;
signed main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	read(n),read(m);
	for(int i=1,u,v;i<=m;++i) read(u),read(v),read(dis[u][v]);
	for(int i=1;i<(1<<n);++i)
		for(int j=0;j<n;++j)
			dp[i][j]=-inf;
	for(int i=1;i<n;++i) if(dis[0][i]) dp[(1<<i)+1][i]=dis[0][i];
	for(int i=1;i<(1<<n);++i)
		for(int j=1;j<n;++j)
			if((i>>j)&1)
				for(int k=0;k<n;++k)
					if((i>>k)&1&&j^k)
						dp[i][j]=max(dp[i][j],dp[i^(1<<j)][k]+dis[k][j]);
	for(int i=(1<<n-1)+1;i<(1<<n);i+=2)
		ans=max(ans,dp[i][n-1]);
	write(ans);
	return 0;
}

2024/10/17 19:50
加载中...