首页 > 其他分享 >[ABC318D] General Weighted Max Matching 题解

[ABC318D] General Weighted Max Matching 题解

时间:2023-09-03 12:57:04浏览次数:43  
标签:Weighted int 题解 LL idxf Max ans idx1 dp

[ABC318D] General Weighted Max Matching 题解

题意

  给定无向有权完全图,求最大权匹配。

思路分析

  注意到 \(n \le 16\),我考虑状压 DP。

  设当前点集 \(S\) 中最大权匹配的答案是 \(f_S\),我们考虑 \(S\) 中“最后”一个点 \(p\)(这里的“最后”一个点是指,在状压表示状态的时候,最后一个 1 所代表的那个点,只需从这个点考虑就行,不需要考虑其他前面的点,因为会被更小状态考虑过)。

  我们可以从前面其他点中,选择一个点 \(q\) 和这个点匹配,也可以不匹配这个点。于是有转移方程:

\[f_S = \max(f_{S-p},f_{S-p-q}),p \in S,q \in S, p \ne q \]

  其中 \(w_{p,q}\) 代表点 \(p\) 与点 \(q\) 之间的边权。

  初始化:当 \(S\) 中没有点或只有一个点的时候 \(f_S = 0\);当 \(S\) 中有两个点 \(u,v\) 时,\(F_S = w_{u,v}\)。

代码

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 18;
const int S = (1<<(N+1));

LL a[N][N];
LL dp[S];
LL cnt[S];
LL n;

int count(int s)
{
	if(cnt[s] != -1)
		return cnt[s];
	int ans = 0;
	while(s>0)
	{
		ans += (s&1);
		s >>= 1;
	}
	return cnt[s] = ans;
}

LL dfs(int s)
{
	if(dp[s] != -1) return dp[s];
	if(count(s) <= 1)
	{
		dp[s] = 0;
		return 0;
	}
	if(count(s) == 2)
	{
		int idx1 = -1,idx2 = -1;
		int tmp = s,tmpidx = 0;
		while(tmp>0)
		{
			if(tmp&1)
			{
				if(idx1 == -1)
				{
					idx1 = tmpidx;
				}
				else
				{
					idx2 = idx1;
					idx1 = tmpidx;
				}
			}
			tmpidx++;
			tmp >>= 1;
		}
		dp[s] = a[idx1][idx2];
		return dp[s];
	}
	LL idxf = -1;
	LL ans = 0;
	for(int i = n-1;i >= 0;i--)
	{
		if((s&(1<<i)) > 0)
		{
			if(idxf == -1)
			{
				idxf = i;
			}
			else
			{
				ans = max(ans,a[idxf][i]+dfs(s-(1<<i)-(1<<idxf)));
			}
		}
	}
	ans = max(ans,dfs(s-(1<<idxf)));
	return dp[s] = ans;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
	memset(dp,-1,sizeof(dp));
	memset(cnt,-1,sizeof(cnt));
	cin >> n;
	for(int i = 1;i <= n;i++)
	{
		for(int j = i+1;j <= n;j++)
		{
			cin >> a[i-1][j-1];
			a[j-1][i-1] = a[i-1][j-1];
		}
	}
	dfs((1<<n)-1);
	cout << dp[(1<<n)-1] << "\n";
	return 0;
}

标签:Weighted,int,题解,LL,idxf,Max,ans,idx1,dp
From: https://www.cnblogs.com/l-cacherr/p/17674548.html

相关文章

  • [ABC318E] Sandwiches 题解
    题意给定一个长度为\(N\)的正整数列\(A=\left(A_1,A_2,\cdots,A_N\right)\),求满足以下条件的正整数三元组\(\left(i,j,k\right)\)的数量:\(1\lei<j<k\leN\);\(A_i=A_k\);\(A_i\neqA_j\)。数据范围:\(3\leN\le3\times10^5\);\(1\leA_i......
  • CF1848B Vika and the Bridge 题解
    CF1848BVikaandtheBridge题解题目大意给个题目传送门吧,感觉题意已经很清楚了题目传送门分析(我不会告诉你我第一眼看过去是二分)因为我们只能改一块木板的颜色,所以可以考虑贪心。大概算了下复杂度,也没有问题。题解我们要去求每种颜色最大距离的最小值,那我们可以先去求......
  • 有关Vue-Cli5.X工程中ESLint组件命名检查问题解决
    个人开发环境简介,工具用的VisualStudioCode,因为每个人的开发环境不同,不可能所有解决方案通用,防止踩坑。PSF:\VueWorkSpace\vue_router_test>node-vv16.12.0PSF:\VueWorkSpace\vue_router_test>npm-v8.1.0PSF:\VueWorkSpace\vue_router_test>npmeslint-v8.1.0......
  • P3604 美好的每一天题解
    传送门好题!首先说这道题的时间复杂度:\(O(26n\sqrtn)\)。因为转移是的常数是\(O(26)\)并非\(O(1)\),这启示我们,看数据范围,不要被O(1)给限制了,O(1)是一般情况,有些题不一般首先,回文串能出现的条件是所有的字符都出现偶数次\(or\)仅有一个字符出现奇数次,所以我们并不关心每个......
  • 【题解】AtCoder Beginner Contest 318(D - Ex)
    赛时过了A-G,Ex仿佛猜到了结论但是完全不懂多项式科技,就炸了。大家好像都秒了A,B,C就不写了。D.GeneralWeightedMaxMatching题目描述:给你一个加权无向完全图,图中有\(N\)个顶点,编号从\(1\)到\(N\)。连接顶点\(i\)和\(j\)的\((i<j)\)的权重为\(D_{i,j}\)。在......
  • P4198 楼房重建题解
    传送门一眼数据结构。考虑线段树,记录该区间能看到最多的建筑数量\(ans_{wz}\)以及看到区间中最大的斜率(或者说,该区间内最后看到的建筑)\(xl_{wz}\)。很明显,假如我现在的修改操作是\((x,y)\),那么会改变\(\log_n\)个节点,即包含\(x\)的节点,考虑如何修改他们的\(ans\)和\(......
  • AT_abc318_e 题解
    AT_abc318_eSandwiches题解Links洛谷AtCoderDescription给定一个长度为\(n\)的序列\(a\),找到满足以下条件的三元组\((a,b,c)\)的数量。\(i<j<k\);\(a_{i}=a_{k}\);\(a_{i}\neqa_{j}\)。数据范围:\(1\leqn\leq3\times10^{5}\),\(1\leqa_{i}\leqn......
  • ABC317题解报告
    我直接从第三题开始讲了。T3把数组\(A\)从大到小排序。然后从前往后把前\(q\)个数加起来,然后判断这\(q\)个数的和与\(d\)的大小关系,如果大了就变成\(d\)。然后有些细节就看代码吧。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintm......
  • 龙芯平台Hadoop集群搭建问题解决
    这几天一直在困扰我pycurl版本和本机的版本不符合他连接又连接的自己自带的版本与系统不相同低级也会报错 https://blog.csdn.net/u010910682/article/details/89496550/?ops_request_misc=&request_id=&biz_id=102&utm_term=pycurl7.45.2%20%E6%90%AD%E9%85%8Dlibcurl%E6%......
  • 【题解】NOIP2021
    咕咕咕的东西总是要补的。A.报数题目描述:报数游戏是一个广为流传的休闲小游戏。参加游戏的每个人要按一定顺序轮流报数,但如果下一个报的数是\(7\)的倍数,或十进制表示中含有数字\(7\),就必须跳过这个数,否则就输掉了游戏。在一个风和日丽的下午,刚刚结束SPC20nn比赛的小r和......