我是靠谱客的博主 粗暴豌豆,最近开发中收集的这篇文章主要介绍[洛谷P2210]Haywire,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目大意:有$n(nleqslant12)$个数,每个数和其他三个数连边,求一个排列,使得边的长度最小

题解:状压$DP$,$f_{i,j}$表示当前确定的数状态为$i$,有$j$条边起点被确定终点没有确定的最短距离

卡点:

 

C++ Code:

#include <cstdio>
#define maxn 13
int n, m;
int s[maxn][3];
int f[1 << maxn][maxn * 3];
inline int min(int a, int b) {return a < b ? a : b;}
int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++){
		scanf("%d%d%d", s[i], s[i] + 1, s[i] + 2);
		s[i][0]--, s[i][1]--, s[i][2]--;
	}
	int U = 1 << n;
	__builtin_memset(f, 0x3f, sizeof f);
	f[0][0] = 0;
	for (int i = 0; i < U; i++) {
		for (int j = 0; j < n; j++) if (!(i & 1 << j)){
			for (int k = 0; k <= n * 3; k++) {
				int tmp = k;
				if (i & 1 << s[j][0]) tmp--;
				else tmp++;
				if (i & 1 << s[j][1]) tmp--;
				else tmp++;
				if (i & 1 << s[j][2]) tmp--;
				else tmp++;
				f[i | 1 << j][tmp] = min(f[i | 1 << j][tmp], f[i][k] + tmp);
			}
		}
	}
	printf("%dn", f[U - 1][0]);
	return 0;
}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/9876216.html

最后

以上就是粗暴豌豆为你收集整理的[洛谷P2210]Haywire的全部内容,希望文章能够帮你解决[洛谷P2210]Haywire所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部