题目连接: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(二分匹配)的更多相关文章

  1. POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24081   Accepted: 106 ...

  2. [kuangbin带你飞]专题十 匹配问题 二分匹配部分

    刚回到家 开了二分匹配专题 手握xyl模板 奋力写写写 终于写完了一群模板题 A hdu1045 对这个图进行 行列的重写 给每个位置赋予新的行列 使不能相互打到的位置 拥有不同的行与列 然后左行右列 ...

  3. BZOJ 1189 二分匹配 || 最大流

    1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1155  Solved: 420[Submi ...

  4. Kingdom of Obsession---hdu5943(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943 题意:给你两个数n, s 然后让你判断是否存在(s+1, s+2, s+3, ... , s+n ...

  5. poj 2060 Taxi Cab Scheme (二分匹配)

    Taxi Cab Scheme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5710   Accepted: 2393 D ...

  6. [ACM_图论] Sorting Slides(挑选幻灯片,二分匹配,中等)

    Description Professor Clumsey is going to give an important talk this afternoon. Unfortunately, he i ...

  7. [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)

    描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们 ...

  8. nyoj 237 游戏高手的烦恼 二分匹配--最小点覆盖

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只 ...

  9. UVA5874 Social Holidaying 二分匹配

    二分匹配简单题,看懂题意,建图比较重要. #include<stdio.h> #include<string.h> #define maxn 1100 int map[maxn ...

随机推荐

  1. mybatis xml的无效判空

    <insert id="insert"> <if test="xxxMappingEntityList != null and xxxMappingEn ...

  2. java note

    1.List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复.

  3. HDU-1757--A Simple Math Problem(矩阵乘法)

    Problem Description Lele now is thinking about a simple function f(x).If x < 10 f(x) = x.If x > ...

  4. linux搭建phantomjs+webdriver+testng+ant自动化工程

    因为项目的原因,需要将脚本在linux环境无浏览器化去跑,那么原有的在windows系统下有浏览器化的自动化脚本场景就不适用了,这里给出linux系统下搭建phantomjs+webdriver+te ...

  5. [妙味JS基础]第九课:定时器管理、函数封装

    知识点总结 函数封装 回调函数 实例:抖动函数 获取当前的位置 通过数组来实现,一正一负,直到恢复成0为止. 当前位置与数组中各值相加

  6. 《JavaScript网页特效经典300例-进阶篇》

    <Javascript网页经典特性300例> 进阶篇 第11章:导航菜单特效 二级导航菜单三级导航菜单动态加载导航菜单三级联动导航菜单树形导航菜单当网页超过一屏时导航菜单始终置顶 第12章 ...

  7. 《JS权威指南学习总结--9.3 JS中JAVA式的类继承》

    内容要点: 一.JS中的类 1.JAVA或其他类似强类型 面向对象语言的 类成员的模样 实例字段:它们是基于实例的属性或变量,用以保存独立对象的状态. 实例方法: 它们是类的所有实例所共享的方法,由每 ...

  8. Spring Security(02)——关于登录

    目录 1.1     form-login元素介绍 1.1.1    使用自定义登录页面 1.1.2    指定登录后的页面 1.1.3    指定登录失败后的页面 1.2     http-basi ...

  9. OpenCV2.x自学笔记——Qt5.5.1打包exe

    [简易步骤] 1.Release模式下生成exe,在release文件夹内,如jujube.exe 2.exe单独拷贝到一个文件夹,如D:\jujube\jujube.exe 3.打开Qt 官方开发环 ...

  10. Marble 添加自定义Layer

    #include <marble/MarbleWidget.h> #include <marble/MarbleMap.h> #include <marble/Marbl ...