(45pts)离奇的错误……
查看原帖
(45pts)离奇的错误……
757647
zhangzhixing99楼主2025/7/29 19:11

#44,5158,62\#44, 51 \sim 58, 62 过了,其它全 WA\color{#FF0000}\text{WA},太离奇了,求大佬帮助……

#include <bits/stdc++.h>
using namespace std;

#define EOL '\n'

#define __LOG true
#ifdef __LOG
#define PRINTF printf
#else
#define PRINTF //
#endif

#define __IOFILE true
#ifdef __IOFILE
#define FREOPEN freopen
#else
#define FREOPEN //
#endif

const int iINF = 0x3f3f3f3f;
const long long lINF = 9e18;

struct Graph
{
	int to[2010], wei[2010], nxt[2010], pos[20], tot;
	Graph(): tot(0) {}
	void AddEdge(int u, int v, int w)
	{
		++tot;
		to[tot] = v;
		wei[tot] = w;
		nxt[tot] = pos[u];
		pos[u] = tot;
	}
};

int length[20][20], dep[20];
Graph G;
long long f[5010];
bool vis[20];

void get_dep(int u)
{
	vis[u] = true;
	for (int eid = G.pos[u]; eid; eid = G.nxt[eid])
	{
		int v = G.to[eid];
		if (vis[v])
		{
			continue;
		}
		dep[v] = dep[u] + 1;
		get_dep(v);
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int n, m;
	cin >> n >> m;
	memset(length, 0x3f, sizeof length);
	while (m--)
	{
		int u, v, w;
		cin >> u >> v >> w;
		if (u == v)
		{
			continue;
		}
		length[u][v] = length[v][u] = min(length[u][v], w);
	}
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= n; ++j)
		{
			if (length[i][j] != iINF)
			{
				G.AddEdge(i, j, length[i][j]);
			}
		}
	}
	int k = (1 << n) - 1;
	long long ans = lINF;
	for (int start_u = 1; start_u <= n; ++start_u)
	{
		memset(f, 0x3f, sizeof f);
		f[(1 << (n - start_u))] = 0;
		for (int status = 1; status < k; ++status)
		{
			for (int i = 1; i <= n; ++i)
			{
				vis[i] = !(status & (1 << (n - i)));
			}
			dep[start_u] = 1;
			get_dep(start_u);
			for (int u = 1; u <= n; ++u)
			{
				if (!(status & (1 << (n - u))))
				{
					continue;
				}
				for (int eid = G.pos[u]; eid; eid = G.nxt[eid])
				{
					int v = G.to[eid], w = G.wei[eid];
					if (status & (1 << (n - v)))
					{
						continue;
					}
					f[status + (1 << (n - v))] = min(f[status + (1 << (n - v))], f[status] + (dep[u]) * w);
				}
			}
		}
		ans = min(ans, f[k]);
	}
	cout << ans << EOL;
	return 0;
}
2025/7/29 19:11
加载中...