求调
查看原帖
求调
507374
sqrtqwq楼主2023/11/12 08:00

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int maxm = 30;
const int maxn = 1 << 8;
struct edge
{
	int to,nxt,w;
}e[maxm << 1];
int head[maxm],tot;
void add_edge(int u,int v,int w)
{
	e[++tot].nxt = head[u];
	head[u] = tot;
	e[tot].to = v;
	e[tot].w = w;
}
int n,m,K;
int dp[maxn];
signed main()
{
	cin >> n >> m >> K;
	for(int i = 1;i <= m;i++)
	{
		int u,v,w;
		cin >> u >> v >> w;
		u--;
		v--;
		add_edge(u,v,w);
		add_edge(v,u,w);
	}
	memset(dp,63,sizeof(dp));
	const int maxx = dp[0];
	for(int i = 0;i < n;i++)
	{
		dp[1 << i] = 0;
	}
	for(int i = 1;i < 1 << n;i++)
	{
		for(int k = 0;k < n;k++)
		{
			if(i & (1 << k))
			{
				int S = i - (1 << k);
				for(int j = head[k];j;j = e[j].nxt)
				{
					int v = e[j].to;
					if(i & (1 << v))
					{
						if(dp[S] == maxx)
						{
							continue;
						}
						int res = (dp[S] + e[j].w) % K;
						dp[i] = min(dp[i],res);
					}
				}
			}
		}
	}
	cout << dp[(1 << n) - 1];
	return 0;
}

写了一个状压

2023/11/12 08:00
加载中...