hdu_5727_Necklace(二分匹配)
题目连接:hdu_5727_Necklace
题意:
有2*n个珠子,n个阳珠子,n个阴珠子,现在要将这2n个珠子做成一个项链,珠子只能阴阳交替排,有些阳珠子周围如果放了指定的阴珠子就会变坏,给你一个n和m个关系x y,这些关系指明了阳珠子x周围放y阴珠子会变坏,现在问你做成这条项链,最少变坏的阳珠子有多少个
题解:
官方题解给的是用DFS 带剪枝来做,不过我感觉那样好玄学,我的做法是将所有的阴珠子可能组成的组合全部算出来,然后用阳珠子去插空,这里插空我们要找最大的匹配,也就是我们可以用二分匹配来做,为什么要找最大匹配,因为我们要得到最少的变坏珠子,我们要找到阳珠子在不变坏的情况下最多可以放的个数。然后就是建图,
我们先把二分图的所有的边都连上,然后如果发现阳珠子在这个空会变坏,那么我们就删除这条边,最后跑匈牙利跑出来就是最大的不会变坏的阳珠子个数,然后我们维护一下每种阴珠子的排列方式下的ans,总时间复杂度为(n-1)!*n2这里n<=9,所以随便能跑过,为什么是n-1,因为这是一个环,我们可以固定其中一个点,这样可以少一个阶,当然你还可以优化到((n-1)!*n2)/2,因为这个环你从左边开始排和从右边开始排石一样的。
#include<bits/stdc++.h>
#define mst(a,b) memset(a,b,sizeof(a))
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std; const int N=;
int g[N],nxt[N],v[N],ed,n,m,x,y,f[],b[],G[][]; inline void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;}
inline void up(int &a,int b){if(a>b)a=b;} int find(int x,int m)
{
F(i,,m)
if(G[x][i]&&!b[i])
{
b[i]=;
if(!f[i]||find(f[i],m))return f[i]=x,;
}
return ;
} int hungry(int n,int m,int ans=)
{
mst(f,);
F(i,,n)mst(b,),ans+=find(i,m);
return ans;
} int main(){
while(~scanf("%d%d",&n,&m))
{
if(n==||m==){puts("");continue;}
mst(g,),ed=;
F(i,,m)scanf("%d%d",&x,&y),adg(y,x);
int now[],ans=;
F(i,,n)now[i]=i;
do{
F(i,,n)F(j,,n)G[i][j]=;
F(ic,,n)for(int i=g[now[ic]];i;i=nxt[i])
if(ic==)G[][v[i]]=G[n][v[i]]=;
else G[ic][v[i]]=G[ic-][v[i]]=;
up(ans,n-hungry(n,n));
if(!ans)break;
}while(next_permutation(now+,now++n));
printf("%d\n",ans);
}
return ;
}
hdu_5727_Necklace(二分匹配)的更多相关文章
- POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)
The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24081 Accepted: 106 ...
- [kuangbin带你飞]专题十 匹配问题 二分匹配部分
刚回到家 开了二分匹配专题 手握xyl模板 奋力写写写 终于写完了一群模板题 A hdu1045 对这个图进行 行列的重写 给每个位置赋予新的行列 使不能相互打到的位置 拥有不同的行与列 然后左行右列 ...
- BZOJ 1189 二分匹配 || 最大流
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1155 Solved: 420[Submi ...
- Kingdom of Obsession---hdu5943(二分匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943 题意:给你两个数n, s 然后让你判断是否存在(s+1, s+2, s+3, ... , s+n ...
- poj 2060 Taxi Cab Scheme (二分匹配)
Taxi Cab Scheme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5710 Accepted: 2393 D ...
- [ACM_图论] Sorting Slides(挑选幻灯片,二分匹配,中等)
Description Professor Clumsey is going to give an important talk this afternoon. Unfortunately, he i ...
- [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)
描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们 ...
- nyoj 237 游戏高手的烦恼 二分匹配--最小点覆盖
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只 ...
- UVA5874 Social Holidaying 二分匹配
二分匹配简单题,看懂题意,建图比较重要. #include<stdio.h> #include<string.h> #define maxn 1100 int map[maxn ...
随机推荐
- Boolean对象 识记
Boolean 对象表示两个值:"true" 或 "false". 1.创建 new Boolean(value); //构造函数 返回 对象+返回值 Bool ...
- TCP/IP 协议(摘抄)
TCP/IP 协议 TCP/IP 是不同的通信协议的大集合. 协议族 TCP/IP 是基于 TCP 和 IP 这两个最初的协议之上的不同的通信协议的大集合. TCP - 传输控制协议 TCP 用于从应 ...
- Learning C# by Developing Games with Unity 5.x(2nd)
项目:https://pan.baidu.com/s/1o7IMcZo using UnityEngine; using System.Collections; namespace VoidGame ...
- lldb 命令
po [[UIWindow keyWindow] recursiveDescription]
- LEK-Introduction
LEK - logstash + elasticsearch + Kibana Elasticsearch, Logstash, and Kibana — designed to take data ...
- mysql中的unix_timestamp函数
偶然看到MySQL的一个函数 unix_timestamp(),不明就里,于是就试验了一番. unix_timestamp()函数的作用是返回一个确切的时间点的UNIX时间戳,这个Unix时间戳是一个 ...
- Linux学习 -- 常用命令
目录处理命令 ls mkdir rmdir pwd cd cp mv rm 文件处理命令 touch cat tac more less head tail 连接命令 ln 软连接 ln -s 类似于 ...
- wps使用积累
1.word加批注: 选中文字--插入--批注
- 详解Bootstrap 定义按钮的样式(CSS)
以下样式可用于<a>, <button>, 或 <input> 元素上: 更多关于Bootstrap 定义CSS样式的可查看:http://v2.bootcss.c ...
- javascript 限制字符串字数换行 带BUG
function chang(str ,len) { function lenStat(str) { function isChinese(str) { //判断是不是中文 var reCh = /[ ...