[hdu5313]二分图性质,dp
题意:给定二分图,求添加的最多边数,使得添加之后还是二分图
思路:如果原图可以分成X,Y两个点集,那么边数最多为|X||Y|条。由于|X|+|Y|==n,所以需要使|X|与|Y|尽量接近。先对原图进行染色,对每个连通块,求出它的两种颜色的点数差,并且交换染的颜色,染色方案依然成立。不妨设染色0和1,cnt[i]表示颜色为i的点的个数,并假设cnt[1]总是大于等于cnt[0],|X|对应cnt[1],|Y|对应cnt[0],
(1)对于同一个连通块,由于可以改变第一次染的颜色,则有:
cnt[1]-cnt[0] = ±abs(cnt[1]-cnt[0])
(2)对不同连通块,有:
cnt[1]-cnt[0]=Σ±abs(cnt[1]-cnt[0])
左边表示最后的染色为1和0的点数差,也就是|X|-|Y|,右边是一个表达式,值取决于对每一个连通块取的正负情况。于是相当于在一系列正数前面添上正负号,使得最后结果是最小的正数,注意到每个数前面必须添上正号或符号,而所有正数的和是知道的,令为V,同时令第i个正数为Ai,于是转化为以V/2为背包容量、Ai为物品体积、求背包能放满的最大体积,用V减去2倍这个答案就是等号左边的最小值了。|X|-|Y|和|X|+|Y|都出来了,求出|X|、|Y|,|X||Y|-m便是答案。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | /* ******************************************************************************** */#include <iostream>                                                                 //#include <cstdio>                                                                   //#include <cmath>                                                                    //#include <cstdlib>                                                                  //#include <cstring>                                                                  //#include <vector>                                                                   //#include <ctime>                                                                    //#include <deque>                                                                    //#include <queue>                                                                    //#include <algorithm>                                                                //usingnamespacestd;                                                                //                                                                                    //#define pb push_back                                                                //#define mp make_pair                                                                //#define X first                                                                     //#define Y second                                                                    //#define all(a) (a).begin(), (a).end()                                               //#define foreach(i, a) for (typeof(a.begin()) it = a.begin(); it != a.end(); it ++)  //                                                                                    //voidRI(vector<int>&a,intn){a.resize(n);for(inti=0;i<n;i++)scanf("%d",&a[i]);}    //voidRI(){}voidRI(int&X){scanf("%d",&X);}template<typename...R>                    //voidRI(int&f,R&...r){RI(f);RI(r...);}voidRI(int*p,int*q){intd=p<q?1:-1;          //while(p!=q){scanf("%d",p);p+=d;}}voidprint(){cout<<endl;}template<typenameT>      //voidprint(constT t){cout<<t<<endl;}template<typenameF,typename...R>              //voidprint(constF f,constR...r){cout<<f<<", ";print(r...);}template<typenameT>   //voidprint(T*p, T*q){intd=p<q?1:-1;while(p!=q){cout<<*p<<", ";p+=d;}cout<<endl;}   //                                                                                    //typedefpair<int, int> pii;                                                         //typedeflonglongll;                                                               //typedefunsigned longlongull;                                                     //                                                                                    ///* -------------------------------------------------------------------------------- */                                                                                    //template<typenameT>boolumax(T &a, constT &b) {    returna >= b? false: (a = b, true);}constintmaxn = 1e4 + 7;structGraph {    vector<vector<int> > G;    voidclear() { G.clear(); }    voidresize(intn) { G.resize(n + 2); }    voidadd(intu, intv) { G[u].push_back(v); }    vector<int> & operator [] (intu) { returnG[u]; }};Graph G;intcolor[maxn], cnt[3];voiddfs(intnode, intc) {    color[node] = c;    cnt[c] ++;    for(inti = 0; i < G[node].size(); i ++) {        intv = G[node][i];        if(!color[v]) dfs(v, 3 - c);    }}vector<int> dp;inta[maxn];intget(intn, intv) {    sort(a + 1, a + 1 + n);    dp.clear();    dp.pb(0);    intnow = 0, ans = 0;    boolhave[12345] = {true};    for(inti = 1; i <= n; i ++) {        intsz = dp.size();        for(intj = 0; j < sz; j ++) {            intbuf = dp[j] + a[i];            if(buf <= v && !have[buf]) {                if(buf == v) returnv;                dp.pb(buf);                have[buf] = true;                umax(ans, buf);            }        }    }    returnans;}intmain() {#ifndef ONLINE_JUDGE    freopen("in.txt", "r", stdin);#endif // ONLINE_JUDGE    intT, n, m;    cin >> T;    while(T --) {        cin >> n >> m;        G.clear();        G.resize(n);        for(inti = 0; i < m; i ++) {            intu, v;            scanf("%d%d", &u, &v);            G.add(u, v);            G.add(v, u);        }        memset(color, 0, sizeof(color));        intt = 0, total = 0;        for(inti = 1; i <= n; i ++) {            if(!color[i]) {                cnt[1] = cnt[2] = 0;                dfs(i, 1);                a[++ t] = cnt[1] - cnt[2];                if(a[t] < 0) a[t] = -a[t];                total += a[t];            }        }        inty = total / 2, r = total - 2 * get(t, y);        cout << (n + r) / 2 * (n - r) / 2 - m << endl;    }    return0;                                                                       //}                                                                                   //                                                                                    //                                                                                    //                                                                                    ///* ******************************************************************************** */ | 
[hdu5313]二分图性质,dp的更多相关文章
- 【POJ 1112】Team Them Up!(二分图染色+DP)
		Description Your task is to divide a number of persons into two teams, in such a way, that: everyone ... 
- Rigid Frameworks (画图二分图规律 + DP + 数学组合容斥)
		题意:方格n*m,然后对于每一个格子有3种画法1左对角线2右对角线3不画,求让图形稳定的画法有多少种? 思路:通过手画二分图可以发现当二分图联通时改图满足条件,然后我们对于一个dp[n][m]可以利用 ... 
- Codeforces 1461F - Mathematical Expression(分类讨论+找性质+dp)
		现场 1 小时 44 分钟过掉此题,祭之 大力分类讨论. 如果 \(|s|=1\),那么显然所有位置都只能填上这个字符,因为你只能这么填. scanf("%d",&n);m ... 
- CF 407B Long Path[观察性质 DP]
		B. Long Path time limit per test 1 second memory limit per test 256 megabytes input standard input o ... 
- 【gdoi2018 day2】第二题 滑稽子图(subgraph)(性质DP+多项式)
		题目大意 [gdoi2018 day2]第二题 滑稽子图(subgraph) 给你一颗树\(T\),以及一个常数\(K\),对于\(T\)的点集\(V\)的子集\(S\). 定义\(f(S)\)为点集 ... 
- 【GDOI2016模拟3.15】基因合成(回文串+性质+DP)
		[GDOI2016模拟3.15]基因合成 题意: 给一个目标串,要求从空串进行最少的操作次数变成目标串,操作有两种: 在串的头或尾加入一个字符. 把串复制一遍后反向接到串的末尾. 因为有回文操作,所以 ... 
- poj-1112 (二分图染色+dp分组)
		#include <iostream> #include <algorithm> #include <cstring> using namespace std; ; ... 
- bzoj 5006(洛谷 4547) [THUWC2017]Bipartite 随机二分图——期望DP
		题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5006 https://www.luogu.org/problemnew/show/P4547 ... 
- [agc001E]BBQ Hard[组合数性质+dp]
		Description 传送门 Solution 题目简化后要求的实际上是$\sum _{i=1}^{n-1}\sum _{j=i+1}^{n}C^{A[i]+A[j]}_{A[i]+A[j]+B[i ... 
随机推荐
- vue2.x学习笔记(二十二)
			接着前面的内容:https://www.cnblogs.com/yanggb/p/12633051.html. 自定义指令 简介 除了核心功能默认内置的指令([v-mode]和[v-show]等),v ... 
- ASP.NET Core技术研究-全面认识Web服务器Kestrel
			因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel.相信大家刚接触这个Kestrel时,会有各种各样的疑问. 今天我们全面认识一下ASP. ... 
- Java 多线程实现方式三:实现 Callable 接口
			完整套路 java 通过实现Callable 接口来实现多线程相比较于继承Thread 接口和 实现Runnable 接口比较麻烦,但好处是可以有返回值. 基本套路: 1. 创建目标对象 2. 创建执 ... 
- Apache Hudi集成Apache Zeppelin实战
			1. 简介 Apache Zeppelin 是一个提供交互数据分析且基于Web的笔记本.方便你做出可数据驱动的.可交互且可协作的精美文档,并且支持多种语言,包括 Scala(使用 Apache Spa ... 
- 【AspNetCore源码】设计模式 - 提供者模式
			AspNetCore源代码发现日志模块的设计模式(提供者模式),特此记录 学习设计模式的好处是,我们可以容易扩展它达到我们要求,除了要知道如何扩展它,还应该在其他地方应用它 类图 & 分析 角 ... 
- 大部分人都不知道的8个python神操作
			01 print 打印带有颜色的信息 大家知道 Python 中的信息打印函数 Print,一般我们会使用它打印一些东西,作为一个简单调试. 但是你知道么,这个 Print 打印出来的字体颜色是可以设 ... 
- 防止html标签转义
			function htmlDecode ( str ) { var ele = document.createElement('span'); ele.innerHTML = str; return ... 
- 如何在 Inno Setup 中执行命令行的命令
			Pascal Scripting: Exec Prototype: function Exec(const Filename, Params, WorkingDir: String; const Sh ... 
- 日志分析工具ELK(三)
			目前官网更新特别快,不到半年时间就更新了好几个版本,目前最新的是5.1 以下安装配置使用4.5版本的 https://www.elastic.co/guide/en/kibana/4.5/index. ... 
- QML-密码管理器
			Intro 年初刚学Qml时写的密码管理器.用到Socket通信.AES加密等.UI采用Material Design,并实现了Android App的一些常见基本功能,如下拉刷新.弹出提示.再按一次 ... 
