首页 > 其他分享 >CF1711B Party 题解

CF1711B Party 题解

时间:2024-03-23 20:35:34浏览次数:22  
标签:ch 删除 point read 题解 CF1711B int edge Party

CF1711B Party

原题题意

给定 $n$ 个点带点权的无向图,点权 $a_i$ 保证无重边自环,点权非负),要求删去一些点和它相连的边,使得剩下这个图的边数为偶数且删去点的点权之和最小。问删去点的点权之和最小是多少?

分类讨论

我们分类讨论一下。

  • $m$ 为偶数,则不需要删边或点,直接输出 $0$ 即可。

  • $m$ 为奇数,我们称有单数条边与其相连的点为单点,反之为双点。

    1. 删除一个点,则必须为单点(奇-偶=奇 奇-奇=偶)
    2. 删除两个点,若两点中有单点,则直接删除单点更优,所以应当删除两个双点;因为需要删除的总边数为单数,所以删除的双点应该有公共边:故删除一条边相连的两个双点满足题意。
    3. 删除三个点,不如删除一个或两个更优,故不考虑。

代码及注释

/*code by Cheemsadoge*/
#include <bits/stdc++.h>
using namespace std;
template<typename T> inline void read(T &x) {
	x=0;T w=1,ch=getchar();
	while(!isdigit(ch)&&ch!='-')ch=getchar();
	if(ch=='-')w=-1,ch=getchar();
	while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();
	x=x*w;
}//fast input
const int MAXN=1e5+1145;
const int INF=2147483647ll;//2^31-1
struct Edge{int u,v;}edge[MAXN];	//边,u、v分别表示边相连的两点
struct Point{int val,stick,num;}point[MAXN]; //点,val表示边权(即不快乐值),stick表示与点所连的边数,num表示编号
int n,m,totr,ans=INF,wans=INF,num,a,b;
bool single[MAXN]; //判断i与i点所连的边数是否为单(是则赋值true)->single[i]即point[i].stick%2==1 
void add_edge(int u,int v){edge[++totr].u=u;edge[totr].v=v;point[v].stick++;point[u].stick++;} //加边
queue<Point>po;
void initialize()//初始化
{
		totr=0;ans=INF;wans=INF;
		memset(edge,0,sizeof(edge));
		memset(point,0,sizeof(point));
		memset(single,0,sizeof(single));	
}
int main() {
	Point u;
	int T;read(T);while(T--){
		initialize();
		read(n),read(m);		read(n),read(m);
		initialize();
		for(int i=1;i<=n;i++) read(point[i].val),point[i].num=i,po.push(point[i]);//暂时将点放入po队列,方便取用
		for(int i=1;i<=m;i++) read(a),read(b),add_edge(a,b);//加边
		if(m%2==0) {printf("0\n");continue;}//特判:若有偶数条边,则输出0.注意:不要把此句放在上两行前,否则会跳过输入
		while(!po.empty()){
			num=po.front().num;u=point[num];//等同于u=po.front; 
			if(u.stick%2) {ans=min(ans,u.val);single[u.num]=1;}//判断与点相连的边数是否为单,并将其中点权最小值存入ans
			po.pop();
		}
		for(int i=1;i<=m;i++) if((!single[edge[i].v])&&(!single[edge[i].u])) wans=min(wans,point[edge[i].u].val+point[edge[i].v].val);
		//枚举边,若所连两点的stick为复数,则将两点点权相加存入wans取最小
		printf("%d\n",min(ans,wans));//输出最小值
	}
}

标签:ch,删除,point,read,题解,CF1711B,int,edge,Party
From: https://www.cnblogs.com/cheemsadoge/p/18091631

相关文章

  • 洛谷P3498 [POI2010] KOR-Beads 题解
    P3498[POI2010]KOR-Beads对于数列${A_i}$,求$k$使数列被分为$\lfloor\frac{n}{k}\rfloor$个部分后不同子数列种类最多(子串翻转前后为一类子串)很容易想到:枚举$k\\in\[1,n]$,记录每个$k$下不同种类数,然后取最优即可,那么问题来了:如何计算种类数?暴戾算法:一种纯......
  • 跳马【华为OD机试JAVA&Python&C++&JS题解】
    一.题目马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。给顶m行n列的棋盘(网格图),棋盘上只有有棋子象棋中的棋子“马”,并且每个棋子有等级之分,等级为k的马可以跳1~k......
  • CF710D Two Arithmetic Progressions 题解
    CF710DTwoArithmeticProgressions根号分治薄纱数论看日报学习的根号分治:暴力美学——浅谈根号分治-paulzrm的博客。开始想学ODT的映射思想的推广-金珂拉的博客,结果先学了ODT,又学了根号分治,才搞懂前置知识。什么是根号分治根号分治,是暴力美学的集大成体现。与......
  • [暴力题解系列]2023年蓝桥杯-子串简写
    ​ 大伙都说暴力是最低级的算法,啊那确实。但是好的暴力才是真正牛逼的骗分。咱就是说,暴力如何骗分呢?就是基于最暴力的算法一步步优化到能得更多分的暴力。子串简写这题,首先第一步就能想到一件事情:暴力枚举子串开头和末尾的位置,检查是否是符合题目要求的字符,如果是,并且长度大于......
  • 题解:AT_arc174_a [ARC174A] A Multiply
    题传。先要将\(C\)分类。\(C>0\),为了使答案更大,要乘上一个最大的区间和。\(C\le0\),为了使答案更大,选择乘上一个最小的区间和,因为此时我们可以贪心地想,如果区间和越小,乘上一个负数或\(0\)后,答案减少得越小,甚至乘上负数,还会使答案增大,所以也可以用负负得正来解释。当......
  • P8756 [蓝桥杯 2021 省 AB2] 国际象棋 题解
    设计状态什么的就不讲了,这里是对其它题解的优化。怎么优化呢,我们可以知道的是我们只要明确了当前行的状态,上一行的可选集就是知道的,如果我们明确了当前行以及上一行的状态,那么上上行的可选集就是知道的,于是我们就可以使用二进制子集枚举来写,这样就减去了全部不合法的枝叶,我们可以......
  • CF794F Leha and security system 题解
    题目链接:CF或者洛谷首先观察到题目的修改\(x\rightarrowy\),是每个位置的\(x\)都要变,那就显然的拆位去算每一位的贡献。当然,你又发现\(x\rightarrowy\),这玩意属于值为\(x\)的位变化成\(y\),那么这个和普通的拆位区别就在于这是维护值域维的拆位,我们拆位\(0\sim9\)......
  • [HDU5396] Expression 题解
    每次合并两个数,做过石子合并的人都能看出来是区间dp。设状态\(dp_{i,j}\)表示区间\([i,j]\)中合并为一个数的所有情况之和。那么我们就可以枚举断点\(k\):\(b_k\)为\(+\):\([i,k]\)中的每种情况都要和\([k+1,j]\)中的每种情况产生一个贡献,所以总贡献为\(dp_{i,k}\ti......
  • 2024年3月22号题解
    Fliptile解题思路对于这个题目可以用递推来写因为每次翻转只会影响一个十字架的区域,所以如果我们知道第一行的情况,那么是不是只要把第一行的所有的1在对应的下一个行的相同位置进行翻转就可以把第一行的所有的1变成0呢(重要性质) 那么只要我们不断递推下去就可以得到最后一......
  • CF1946E 题解
    Blog赛场上差一点做出来。首先发现左右两部分是比较独立的,所以可以分开计算后合并。注意到我们可以把整个数集分成左右两部分,即\(\binom{n-1}{p_{m1}-1}\)。然后我们不妨只考虑左边。发现左边的最大值也已经确定,且最大值右边的所有数可以随便选,即\(\binom{p_{i+1}-......