2016 Multi-University Training Contest 1-1005---HDU 5727 Necklace(枚举+二分图匹配)

本文主要是介绍2016 Multi-University Training Contest 1-1005---HDU 5727 Necklace(枚举+二分图匹配),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:HDU 5727

题意:有一些 宝石,分为阴阳两种,且数量相等,要串成一条项链,并且阴阳宝石不能相邻。同时,有一些阳宝石与特定的阴宝石相邻则会使得其变得暗淡无光。给出这些规则要求最少有多少个阳宝石会变得暗淡无光。

题解 :

其实就是一个阴阳宝石怎么交错摆放的问题,很容易想到通过DFS去搜索枚举,但是直接阴 阳交错搜索的话,时间复杂度太高。因此我们首先选取一种宝石(假设为阴),枚举所有的摆放情况,(最多(n-1)!=8!种)之后再依次枚举插入另一 种宝石(假设为阳),采用二分图匹配,如果在当前位置插入不会使得阳宝石变得暗淡,则建一条边。最后匈牙利跑一遍求出最大匹配,不能匹配的即为最少的暗淡宝石的数量。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=9+5;
const int INF=0x3f3f3f3f;
int yes[MAXN][MAXN];
int g[MAXN][MAXN];
int boy[MAXN];
int link[MAXN];
int used[MAXN];
int n,m;
int ans;bool dfs(int u)
{for(int v=1;v<=n;v++){if(g[u][v]&&!used[v]){used[v]=1;if(link[v]==-1||dfs(link[v])){link[v]=u;return 1;}}}return 0;
}int hungray()
{int res=0;memset(link,-1,sizeof(link));for(int i=1;i<=n;i++){memset(used,0,sizeof(used));if(dfs(i)) res++;}return  res;
}
int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);while(scanf("%d%d",&n,&m)!=EOF){if(n==0){printf("0\n");continue;}memset(yes,0,sizeof(yes));for(int i=0;i<m;i++){int a,b;scanf("%d%d",&a,&b);yes[a][b]=1;}ans=INF;for(int i=1;i<=n;i++)boy[i]=i;do{for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){g[i][j]=0;if(j!=n&&!yes[i][boy[j]]&&!yes[i][boy[j+1]]) g[i][j]=1;if(j==n&&!yes[i][boy[j]]&&!yes[i][boy[1]]) g[i][j]=1;}}ans=min(ans,n-hungray());}while(next_permutation(boy+2,boy+n+1));printf("%d\n",ans);}return 0;
}


这篇关于2016 Multi-University Training Contest 1-1005---HDU 5727 Necklace(枚举+二分图匹配)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049708

相关文章

SpringBoot3匹配Mybatis3的错误与解决方案

《SpringBoot3匹配Mybatis3的错误与解决方案》文章指出SpringBoot3与MyBatis3兼容性问题,因未更新MyBatis-Plus依赖至SpringBoot3专用坐标,导致类冲... 目录SpringBoot3匹配MyBATis3的错误与解决mybatis在SpringBoot3如果

Kotlin 枚举类使用举例

《Kotlin枚举类使用举例》枚举类(EnumClasses)是Kotlin中用于定义固定集合值的特殊类,它表示一组命名的常量,每个枚举常量都是该类的单例实例,接下来通过本文给大家介绍Kotl... 目录一、编程枚举类核心概念二、基础语法与特性1. 基本定义2. 带参数的枚举3. 实现接口4. 内置属性三、

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思