状压 88 pts 求助
查看原帖
状压 88 pts 求助
530030
hayzxjr楼主2024/5/10 16:34
#include<bits/stdc++.h>
#define ll long long
#define N 20
using namespace std;
ll read(){
	ll x = 0, f = 1; char ch = getchar();
	while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
	while(isdigit(ch)) {x = (x << 3) + (x << 1) + ch - 48; ch = getchar();}
	return x * f;
}
ll n, m, f[1 << N][N], G[N][N];
ll dfs(ll p, ll s){
	if(p == 1 && s == 0) return 0;
	if(p == 1 && s != 0) return LONG_LONG_MIN;
	if(f[p][s] >= 0) return f[p][s];
	ll ans = 0;
	//if(p == 7) printf("%lld\n", s);
	for(int i = 1; i < n; i++){
		if(p & (1 << i) && i != s)
		  ans = max(ans, dfs(p - (1 << s), i) + G[i][s]);
	}
	return f[p][s] = ans;
}
int main(){
	for(int i = 0; i < (1 << N); i++)
	  for(int j = 0; j < N; j++)
	    f[i][j] = LONG_LONG_MIN;
	for(int i = 0; i < N; i++)
	  for(int j = 0; j < N; j++)
	    G[i][j] = LONG_LONG_MIN;
	n = read(), m = read();
	for(int i = 1; i <= m; i++){
		ll u = read(), v = read(), w = read();
		G[u][v] = w;
		if(u == 0) f[1 + (1 << v)][v] = w;
	}
	ll ans = 0; f[1][0] = 0;
	for(ll i = 1; i < (1 << (n - 1)); i++){
		ans = max(ans, dfs(i + (1 << (n - 1)), n - 1));
	}
	printf("%lld\n", ans);
	return 0;
}
2024/5/10 16:34
加载中...