匈牙利算法c
① 算法和软件的关系,程序员应该学习哪些算法
一.基本算法:
枚举. (poj1753,poj2965)
贪心(poj1328,poj2109,poj2586)
递归和分治法.
递推.
构造法.(poj3295)
模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.图算法:
图的深度优先遍历和广度优先遍历.
最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
最小生成树算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
拓扑排序 (poj1094)
二分图的最大匹配 (匈牙利算法) (poj3041,poj3020)
最大流的增广路算法(KM算法). (poj1459,poj3436)
三.数据结构.
串 (poj1035,poj3080,poj1936)
排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)
简单并查集的应用.
哈希表和二分查找等高效查找法(数的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
哈夫曼树(poj3253)
堆
trie树(静态建树、动态建树) (poj2513)
四.简单搜索
深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.动态规划
背包问题. (poj1837,poj1276)
型如下表的简单DP(可参考lrj的书 page149):
E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列) (poj3176,poj1080,poj1159)
C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)
六.数学
组合数学:
1.加法原理和乘法原理.
2.排列组合.
3.递推关系.
(POJ3252,poj1850,poj1019,poj1942)
数论.
1.素数与整除问题
2.进制位.
3.同余模运算.
(poj2635, poj3292,poj1845,poj2115)
计算方法.
1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)
七.计算几何学.
几何公式.
叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)
多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)
(poj1408,poj1584)
凸包. (poj2187,poj1113)
中级(校赛压轴及省赛中等难度):
一.基本算法:
C++的标准模版库的应用. (poj3096,poj3007)
较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)
二.图算法:
差分约束系统的建立和求解. (poj1201,poj2983)
最小费用最大流(poj2516,poj2516,poj2195)
双连通分量(poj2942)
强连通分支及其缩点.(poj2186)
图的割边和割点(poj3352)
最小割模型、网络流规约(poj3308)
② NOI考试的内容是什么
1 时间复杂度(渐近时间复杂隐塌让度的严格定义,NP问题,时间复杂度的分析方法,主定理)
2 排序算法(平方排序算法的应用,Shell排序,快速排序,归并排序,时间复杂度下界,三种线性时间排序,外部排序)
3 数论(整除,集合论,关系,素数,进位制,辗转相除,扩展的辗转相除,同余运算,解线性同余方程,中国剩余定理)
4 指针(链表,搜索判重,邻接表,开散列,二叉树的表示灶局,多叉树的表示)
5 按位运算(and,or,xor,shl,shr,一些应用)
6 图论(图论模型的建立,平面图,欧拉公式与五色定理,求强连通分量,求割点和桥,欧拉回路,AOV问题,AOE问题,最小生成树的三种算法,最短路的三种算 法,标号法,差分约束系统,验证二分图衫哗,Konig定理,匈牙利算法,KM算法,稳定婚姻系统,最大流算法,最小割最大流定理,最小费用最大流算法)
7 计算几何(平面解几及其应用,向量,点积及其应用,叉积及其应用,半平面相交,求点集的凸包,最近点对问题,凸多边形的交,离散化与扫描)
8 数据结构(广度优先搜索,验证括号匹配,表达式计算,递归的编译,Hash表,分段Hash,并查集,Tarjan算法,二叉堆,左偏树,斜堆,二项堆,二叉查找树,AVL,Treap,Splay,静态二叉查找树,2-d树,线段树,二维线段树,矩形树,Trie树,块状链表)
9 组合数学(排列与组合,鸽笼原理,容斥原理,递推,Fibonacci数列,Catalan数列,Stirling数,差分序列,生成函数,置换,Polya原理)
10 概率论(简单概率,条件概率,Bayes定理,期望值)
11 矩阵(矩阵的概念和运算,二分求解线性递推方程,多米诺骨牌棋盘覆盖方案数,高斯消元)
12 字符串处理(KMP,后缀树,有限状态自动机,Huffman编码,简单密码学)
13 动态规划(单调队列,凸完全单调性,树型动规,多叉转二叉,状态压缩类动规,四边形不等式)
14 博奕论(Nim取子游戏,博弈树,Shannon开关游戏)
15 搜索(A*,ID,IDA*,随机调整,遗传算法)
16 微积分初步(极限思想,导数,积分,定积分,立体解析几何)
③ 请教做ACM的常用算法..还是菜鸟
初期:
一.基本算法:
(1)枚举. (poj1753,poj2965)
(2)贪心(poj1328,poj2109,poj2586)
(3)递归和分治法.
(4)递推.
(5)构造法.(poj3295)
(6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.图算法:
(1)图的深度优先遍历和广度优先遍历.
(2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
(3)最小生成树算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
(4)拓扑排序 (poj1094)
(5)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020)
(6)最大流的增广路算法(KM算法). (poj1459,poj3436)
三.数据结构.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)
(3)简单并查集的应用.
(4)哈希表和二分查找等高效查找法(数的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
(5)哈夫曼树(poj3253)
(6)堆
(7)trie树(静态建树、动态建树) (poj2513)
四.简单搜索
(1)深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.动态规划
(1)背包问题. (poj1837,poj1276)
(2)型如下表的简单DP(可参考lrj的书 page149):
1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列)
(poj3176,poj1080,poj1159)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)
六.数学
(1)组合数学:
1.加法原理和乘法原理.
2.排列组合.
3.递推关系.
(POJ3252,poj1850,poj1019,poj1942)
(2)数论.
1.素数与整除问题
2.进制位.
3.同余模运算.
(poj2635, poj3292,poj1845,poj2115)
(3)计算方法.
1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)
七.计算几何学.
(1)几何公式.
(2)叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)
(3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)
(poj1408,poj1584)
(4)凸包. (poj2187,poj1113)
中级:
一.基本算法:
(1)C++的标准模版库的应用. (poj3096,poj3007)
(2)较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)
二.图算法:
(1)差分约束系统的建立和求解. (poj1201,poj2983)
(2)最小费用最大流(poj2516,poj2516,poj2195)
(3)双连通分量(poj2942)
(4)强连通分支及其缩点.(poj2186)
(5)图的割边和割点(poj3352)
(6)最小割模型、网络流规约(poj3308, )
三.数据结构.
(1)线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)
(2)静态二叉检索树. (poj2482,poj2352)
(3)树状树组(poj1195,poj3321)
(4)RMQ. (poj3264,poj3368)
(5)并查集的高级应用. (poj1703,2492)
(6)KMP算法. (poj1961,poj2406)
四.搜索
(1)最优化剪枝和可行性剪枝
(2)搜索的技巧和优化 (poj3411,poj1724)
(3)记忆化搜索(poj3373,poj1691)
五.动态规划
(1)较为复杂的动态规划(如动态规划解特别的施行商问题等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
(2)记录状态的动态规划. (POJ3254,poj2411,poj1185)
(3)树型动态规划(poj2057,poj1947,poj2486,poj3140)
六.数学
(1)组合数学:
1.容斥原理.
2.抽屉原理.
3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).
4.递推关系和母函数.
(2)数学.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率问题. (poj3071,poj3440)
3.GCD、扩展的欧几里德(中国剩余定理) (poj3101)
(3)计算方法.
1.0/1分数规划. (poj2976)
2.三分法求解单峰(单谷)的极值.
3.矩阵法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
(4)随机化算法(poj3318,poj2454)
(5)杂题.
(poj1870,poj3296,poj3286,poj1095)
七.计算几何学.
(1)坐标离散化.
(2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
(3)多边形的内核(半平面交)(poj3130,poj3335)
(4)几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高级:
一.基本算法要求:
(1)代码快速写成,精简但不失风格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
(2)保证正确性和高效性. poj3434
二.图算法:
(1)度限制最小生成树和第K最短路. (poj1639)
(2)最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
(3)最优比率生成树. (poj2728)
(4)最小树形图(poj3164)
(5)次小生成树.
(6)无向图、有向图的最小环
三.数据结构.
(1)trie图的建立和应用. (poj2778)
(2)LCA和RMQ问题(LCA(最近公共祖先问题) 有离线算法(并查集+dfs) 和 在线算法
(RMQ+dfs)).(poj1330)
(3)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的
目的). (poj2823)
(4)左偏树(可合并堆).
(5)后缀树(非常有用的数据结构,也是赛区考题的热点).
(poj3415,poj3294)
四.搜索
(1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
(2)广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
(3)深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法. (poj3131,poj2870,poj2286)
五.动态规划
(1)需要用数据结构优化的动态规划.
(poj2754,poj3378,poj3017)
(2)四边形不等式理论.
(3)较难的状态DP(poj3133)
六.数学
(1)组合数学.
1.MoBius反演(poj2888,poj2154)
2.偏序关系理论.
(2)博奕论.
1.极大极小过程(poj3317,poj1085)
2.Nim问题.
七.计算几何学.
(1)半平面求交(poj3384,poj2540)
(2)可视图的建立(poj2966)
(3)点集最小圆覆盖.
(4)对踵点(poj2079)
八.综合题.
(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)
Dp状态设计与方程总结
1.不完全状态记录
<1>青蛙过河问题
<2>利用区间dp
2.背包类问题
<1> 0-1背包,经典问题
<2>无限背包,经典问题
<3>判定性背包问题
<4>带附属关系的背包问题
<5> + -1背包问题
<6>双背包求最优值
<7>构造三角形问题
<8>带上下界限制的背包问题(012背包)
3.线性的动态规划问题
<1>积木游戏问题
<2>决斗(判定性问题)
<3>圆的最大多边形问题
<4>统计单词个数问题
<5>棋盘分割
<6>日程安排问题
<7>最小逼近问题(求出两数之比最接近某数/两数之和等于某数等等)
<8>方块消除游戏(某区间可以连续消去求最大效益)
<9>资源分配问题
<10>数字三角形问题
<11>漂亮的打印
<12>邮局问题与构造答案
<13>最高积木问题
<14>两段连续和最大
<15>2次幂和问题
<16>N个数的最大M段子段和
<17>交叉最大数问题
4.判定性问题的dp(如判定整除、判定可达性等)
<1>模K问题的dp
<2>特殊的模K问题,求最大(最小)模K的数
<3>变换数问题
5.单调性优化的动态规划
<1>1-SUM问题
<2>2-SUM问题
<3>序列划分问题(单调队列优化)
6.剖分问题(多边形剖分/石子合并/圆的剖分/乘积最大)
<1>凸多边形的三角剖分问题
<2>乘积最大问题
<3>多边形游戏(多边形边上是操作符,顶点有权值)
<4>石子合并(N^3/N^2/NLogN各种优化)
7.贪心的动态规划
<1>最优装载问题
<2>部分背包问题
<3>乘船问题
<4>贪心策略
<5>双机调度问题Johnson算法
8.状态dp
<1>牛仔射击问题(博弈类)
<2>哈密顿路径的状态dp
<3>两支点天平平衡问题
<4>一个有向图的最接近二部图
9.树型dp
<1>完美服务器问题(每个节点有3种状态)
<2>小胖守皇宫问题
<3>网络收费问题
<4>树中漫游问题
<5>树上的博弈
<6>树的最大独立集问题
<7>树的最大平衡值问题
<8>构造树的最小环
④ 参加ACM大赛应该准备哪些课程
课程:
(1)基本算法: 二分,分治,贪心
(2) 离散数学离散数学动态规划
(3) 搜索算法:深度优先 搜索,广度优先搜A*算法 ,阿尔法贝塔剪枝
(4)数据结构:线段树, 树状数组,并查集,Trie图
(5)图论问题:最小生成树 最短路 强连通分量、桥和割点
(6)网络流算法:基本的网络流算法,Dinic算法,带上下界的网络流,最小费用流
(7)计算几何:线与线求交,线与面求交,求凸包,半平面求交等
(8) 离散数学,高等数学,线性代数,初等数论,计算几何
(9)计算机专业英语
(10)C++;基础的递归、枚举算法
(4)匈牙利算法c扩展阅读:
1.参赛队伍最多由三名参赛队员组成。
2.竞赛中命题10题左右,试题描述为英文,比赛时间为5个小时,前四个小时可以实时看到排名,最后一小时封榜,无法看到排名。
3.竞赛可以使用的语言:Java, C, C++, Kotlin 和 Python。
4.重点考察选手的算法和程序设计能力,不考察实际工程中常用的系统编程,多线程编程等等;
5.选手可携带任何非电子类资料,包括书籍和打印出来的程序等,部分赛区会对选手携带的纸质资料做限制。
6.评委负责将结果(正确或出错的类型)通过网络尽快返回给选手,除此之外不提供任何额外帮助;
7.每个题目对应一种颜色的气球,通过该题目的队伍会得到对应颜色气球。每道题目第一支解决掉它的队还会额外获得一个“FIRST PROBLEM SOLVED”的气球。
⑤ 两个人之间的匹配度,两个人容貌上匹配程度
提起两个人之间的匹配度,大家都知道,有人问两个人容貌上匹配程度,另外,还有人想问匹配的图的定义,你知道这是怎么回事?其实如何测试两个人的匹配度,下面就一起来看看两个人容貌上匹配程度,希望能够帮助到大家!
两个人之间的匹配度
1、两个人之间的匹配度:两个人容貌上匹配程度
男才女貌,应该不是指外国妞般配的两个人有什么特征。
2、两个人之间的匹配度:匹配的图的定义
设有M个工人x1,x2,…,xm,和N项工作y1,y2,…,yn,规定每个工人至多做一项工作,而每项工作至多分配一名工人去做。由于种种原因,每个工人只能胜任其中的一项或几项工作。问应怎样分配才能使尽可能多的工人分配到他胜任的工作。这个问题称为人员分配问题。为什么感觉有些人很般配。
人员分配问题可以用图的语言来表述。令X={x1,x2,…,xm},Y={y1,y2,…,yn},构造二分图G=(X,Y,E)如下:两个人很配是什么意思。
对于1≤i≤m,1≤j≤n,当且仅当工人xi胜任工作yi时,G中有一条边xiyi,于是人员分配问题就成为在G中求一个匹配的问题。测试两人婚姻匹配度。
求匹配常用匈牙利算法,它的基本思想是:对于已知的匹配M,从X中的任一选定的M非饱和点出发,用标号法寻找M增广链。如果找到M增广链,则M就可以得到增广;否则从X中另一个M非饱和点出发,继续寻找M增广链。重复这个过程直到G中不存在增广链结束,此时的匹配就是G的匹配。这个算常称为匈牙利算法,因为这里介绍的寻找增广链的标号方法是由匈牙科学者Egerváry最早提出来的。测两个人的恋爱匹配指数。
理解了这个算法,就不难写出人员分配问题的解答了。在给出程序之前,先做一些假设:两个人匹配的意思是什么。
为了简单起见,假设工人数等于工作数,即N=M,且N≤,这里,N也可以看作是二分图的|X|和|Y|。测量情侣匹配度。
数据从文件input.txt中读入,首先是N和|E|,下面|E|行每行两个数(I,J),表示工人I可以胜任工作J,即二分图中的边xiyj。
结果输出到文件output.txt,行是匹配数s,下面s行每行两个数(I,J),表示分配工人I做工作J,即匹配边xiyj。对于上面的人员分配问题,如果还考虑到工人做工的效率,就可以提出所谓的分派问题:应该怎样分配才能使总的效率?看上去很般配的两个人。
同上一节,我们可以构造一个二分图G,如果把工人xi做工作yi的效率wij看作是G中边xiyi的权,则分派问题就相当于在赋权二分图G中求一个全匹配。
由线性规划的知识,求二分图G的权匹配,只需在匈牙利算法的基础上少许改进即可。它的基本思想是,对二分图的顶点编号,然后根据编号构造一个新的二分图G’,把求G的权匹配转换为求G’的完美匹配。情侣照片测匹配度。
下面的这条定理是这个算法的理论基础。
定理:设M是赋权图(权非负)的完全二分图G=(V,E)的一个完美匹配,这里M是E的子集。如果M满足:对G的任意一个完美匹配M’,均有M的边权值之和大于M’边的权值之和,则M是G的权匹配。两个人很般配是什么样的。
下面,给出求权匹配的程序。输入文件中首先是N和|E|,下面|E|行每行三个数(I,J,W),表示工人I做工作J的效率是W。程序输出包括每个工人的选择和的总效益。其它假设参见上一节的算法假设。这个算问题:FJOI-信封问题
John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出。但是,第二天John的儿子SmallJohn将这n封信都拿出了信封。不幸的是,SmallJohn无法将拿出的信正确地装回信封中了。对象匹配度测试。
将SmallJohn所提供的n封信依次编号为1,2,…,n;且n个信封也依次编号为1,2,…,n。假定SmallJohn能提供一组信息:第i封信肯定不是装在信封j中。请编程帮助SmallJohn,尽可能多地将信正确地装回信封。其中n≤。测试两人般配程度。
例如,有4封信,而且封信不是装在信封1、2和3中,第2封信不是装在信封2和3中,则可以确定的封信装在信封4中,而且第二封信则装在信封1中。但这些条件还不足以确定第三封和第四封信的位置。看了这道题目,感觉上和小学数学竞赛中的逻辑推理题如出一辙,而逻辑推理题的一般是表上作业法。
就以前面的例子为例,根据条件,可以得到如下信息:
恋爱契合度测试姓名。
1×××别人说你俩挺配的是什么意思。
2××表格1
由于每一行每一列都应该只有一个√,因此,可以确定封信装在信封4中,于是可以得到:
1×××√恋爱匹配度测试免费。
2×××4×如何测试情侣匹配度。
然后,发现第二行有3个×,因此剩下一个肯定是√,于是就可以得出第二封信则装在信封1中:夫妻相匹配度测试。
测名字看两人配不配。
1×××√
2√×××
现在,第3行和第4行都只有两个×,因此无法确定它们放在那个信封里。
这样我们就得到了一个初步的算法:在程序中建立一个二维表格,首先,根据条件填入若干个×,然后,检查所有还未确定的行和列,看有没有一行(列)中有n–1个×,如果没有,就结束;否则,把剩下的那一个空格填上√,并且填了√的那一行(列)的其它位置都填上×。
这种方法虽然很容易想到,但却有针对这个方法的反例,例如:测试恋爱匹配度。
图表3一个反例情侣匹配度测试免费。
图中上半部分的顶点表示“信”,下半部分的顶点表示“信封”,如果信i可能放在信封j中,则在信i和信封j之间连一条边。由于每个顶点的度数都大于或等于2,即每行每列都至少有两个空位,故前面的算法无法进行任何推理,而事实却并非如此,比如说中间的那封信就只能放在中间的那个信封里。测测我和他能否在一起。
正是这个反例,使我们需要另辟蹊径。进一步分析可以发现,信和信封之间的关系,是一种一一对应的关系,这是因为一封信只能放到一个信封里,而一个信封也只能装一封信。而从信息学的角度来看,这种一一对应的关系,也可以看作是二分图的匹配关系。
令X={x1,x2,…,xm},Y={y1,y2,…,yn},构造二分图G=(X,Y,E),当且仅当信i可以放到信封j中,G中存在边xiyj。这样,任何一种信的分案,都可以看作是图G的一个完美匹配。例如上图就有且仅有如下两种完美匹配:
图表4所有的完美匹配
由于中间的那条匹配边在两个完美匹配中都出现了,因此我们认为这条匹配边是“确定的”,换句话说,这条边所代表的关系也是确定的。容易看出,当且仅当对于G的所有完美匹配M,都存在一条匹配边xiyj,则可以确定信i可以放到信封j中。
这样,我们就从匹配的角度建立了一个新的模型。那么,这个模型要如何求解呢?恋爱适配度计算。
我们当然不能枚举出G所有的完美匹配,然后再去求它们边的交集——这和搜索就没什么分别。在这里,我们需要对这个模型再做一个小小的转换:我们发现,条件“对于G的所有完美匹配M,都存在一条匹配边xiyj”,等价于“如果图G存在完美匹配,而删除图G中的一条边xiyj得到的图G’中却不存在完美匹配”。例如,左下图删除了一条“关键边”,故不存在完美匹配,而右下图删除的是一条“非关键边”,故存在完美匹配。什么叫做匹配。
图表5删边的例子
从表面上看,这个算法的时间复杂度似乎仍然很高。因为图G中最多有n2条边,每次试着删除一条边,又需要O(n3)的时间复杂度求一次完美匹配。总的复杂度高达O(n5)。查询两人的匹配度。
实际上,我们可以先找到图G的一个完美匹配M,这样,删边就只需考虑匹配边了(因为删除非匹配边得到G’,M仍然是G’的完美匹配)。这样,只需删除n条边,时间复杂度就降到了O(n4)。
再进一步分析,删除一条边以后,没有必要重新找完美匹配,只需检查可不可以找到新的增广链就可以了。这样,时间复杂度就进一步降到了O(n3)。问题:CTSC-丘比特的烦恼
随着的不断发展,人与人之间的感情越来越功利化。最近,爱神丘比特发现,爱情也已不再是完全纯洁的了。这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭。于是丘比特千里迢迢远赴中国,找到了掌管东方人爱情的神——月下老人,向他求教。
月下老人告诉丘比特,纯洁的爱情并不是不存在,而是他没有找到。在东方,人们讲究的是缘分。月下老人只要做一男一女两个泥人,在他们之间连上一条红线,那么它们所代表的人就会相爱——无论他们身处何地。而丘比特的爱情之箭只能射中两个距离相当近的人,选择的范围自然就小了很多,不能找到真正的有缘人。
丘比特听了月下老人的解释,茅塞顿开,回去之后用了人间的改造了自己的,使得丘比特之箭的射程大大增加。这样,射中有缘人的机会也增加了不少。
情人节(Valentine’sday)的午夜零时,丘比特开始了自己的工作。他选择了一组数目相等的男女,到他们互相之间的缘分大小,并依次箭,使他们产生爱意。他希望能选择的方法,使被他选择的每一个人被射中一次,且每一对被射中的人之间的缘分的和。
当然,无论丘比特怎么改造自己的,总还是存在缺陷的。首先,的射程尽管增大了,但毕竟还是有限的,不能像月下老人那样,做到“千里姻缘一线牵”。其次,无论怎么改造,箭的轨迹终归只能是一条直线,也就是说,如果两个人之间的连线段上有别人,那么莫不可向他们丘比特之箭,否则,按月下老人的话,就是“乱点鸳鸯谱”了。
作为一个凡人,你的任务是运用先进的计算机为丘比特找到的方案。
输入文件行为正整数k,表示丘比特之箭的射程,第二行为正整数n(n<30),随后有2n行,表示丘比特选中的人的信息,其中前n行为男子,后n行为女子。每个人的信息由两部分组成:他的姓名和他的位置。姓名是长度小于20且仅包含字母的字串,忽略大小写的区别,位置是由一对整数表示的坐标,它们之间用空格分隔。格式为Namexy。输入文件剩下的部分描述了这些人的缘分。每一行的格式为。Name1和Name2为有缘人的姓名,p是他们之间的缘分值(p为小于等于的正整数)。以一个End作为文件结束标志。每两个人之间的缘分至多只被描述一次。如果没有被描述,则说明他们缘分值为1。
输出文件仅一个正整数,表示每一对被射中的人之间的缘分的总和。这个和应当是的。题目中出现了三类物体和两种关系,我们一个个的来分析:
丘比特的箭,它有一个属性是射程,
男人和女人,他们的属性包括名字和位置,
男人和女人之间的关系,这个关系是他们俩的缘分值,
箭与男女的关系,如果两人的距离不超过箭的射程,并无他人阻挡,则可能被箭射中。题目就是要求一种射箭的方案,使得所有被射中的男女的缘分和。
这个问题很像是要求一个二分图的权匹配。因为男人和女人分属两个,而且同性之间没有任何关系,因此是一个二分图。而把缘分值记做边上的权,则缘分和,就对应了这个二分图中的一个权匹配。
要注意的是,题目中虽然说明没有被描述的男女之间缘分值为1,但这并不代表所得到的二分图是完全二分图。因为在构图的过程中,我们必须还考虑到箭的射程等因素——如果两人的距离超过了箭的射程,则他俩注定无缘了。
这时问题就来了,因为题目中除了要求缘分和之外,还要求“被丘比特选择的每一个人都要被射中一次”。
你可能会觉得,要缘分和越大,当然被射中的人越多越好,其实并不是这样。例如:
图表6一个反例
如果要求权匹配,则会选择匹配边AD,缘分和为10。但由于每个人都要被射中一次,因此我们只能选择AC和BD,缘分和为2。
换句话说,对于这个例子,正确答案应该是2,而权匹配的值却是10。这说明,这道题目和简单的权匹配还是有区别的,因为题目再要求权值的同时,还要求是一个完美匹配,我们称之为“完美”的权匹配。
那么,这道题是否就不能用权匹配来做了呢?先别急,我们再来回顾一下求权匹配的算法:我们通过对顶点编号,将图G转化为G’,然后在把求G的权匹配转换为求G’的完美匹配——这里好像就是求完美匹配,但对于上面的那个例子,又为什么不呢?
原来,对于上面的例子,在标号过后,新的图G’中加入了一条新的边BC,而这条边的权值是0,在图G’中的完美匹配,实际上是AD和BC,对应到图G中,就是边AD了。
因此,如果我们预先把BC的边的权值设为-∞,再求图中的权匹配,就不会再有问题了。
更一般的,如果要求二分图的“完美”的权匹配,只需将原图中没有的边的权值设为-∞,就可以了。问题:IPSC-Magic
一个的术师上台表演,跟着他的是一位漂亮的女助手。术师先从他的术帽中拽出了几只兔子,接着他又从女助手的围巾中变出了一束鲜花,,他把女助手锁在一个看上去空着的箱子里。然后,术师选了一个观众来配合一个表演:他在一个桌子上摆出N张牌(所有N张牌两两不同,且N为奇数)。术师让这位自愿者走上讲台从中选出(N+1)/2张牌,其余的牌都在术师的帽子里永远的消失了。术师在选出的牌上方晃了晃手,接着他选出其中一张交给那一位自愿者,自愿者向观众展示了手中的这张牌,随后又将其在自己的衣袋里。那位女助手从箱子里放出来后,来到桌前也在剩下的(N+1)/2-1张牌上方晃了晃手,马上就说出了自愿者衣袋中的是什么牌。
这是为什么呢?我们先看一下下面这张表,这是N=5的情况:
自愿者选的牌术师选的牌助手所看到的牌
1,2,2
1,2,4
1,2,5
1,3,3
1,3,5
1,4,5
2,3,3
2,3,5
2,4,4
3,4,4
其中,自愿者选的牌-术师选的牌=助手所看到的牌。表中包括了自愿者选牌的所有可能性,它们两两不同。而助手所看到的牌,也是两两不同的。
首先,术师和他的助手都要记住这张表。这样,当助手看到的牌是2,4时,她就可以肯定自愿者选的牌是2,4,5,且术师选的牌就是5。
现在,告诉你n的值,要你求出这张表。其中n≤15。为了便于分析,我们令M表示从N张牌中选取(N+1)/2张牌的方案数,显然,从这N张牌中选出(N+1)/2-1张牌的方案数也是M。
我们先从枚举的角度入手,下面给出两种枚举的方法:
对于自愿者的每种选牌的方案,枚举术师所选的牌。
如何测试两个人的匹配度
对于自愿者的每种选牌的方案,所对应的助手看到的牌。
方案一需要M次决策,每次决策中有N种选择;方案二同样需要M次决策,而每次决策的可以有M种选择。从这点上来看,方案一要好得多。、
可是方案一所表现出来的“自愿者的选牌的方案”和“术师所选的牌”之间的关系并不是一一对应的关系,对于自愿者不同的选牌的方案,术师可以选择相同的牌。
而方案二中所表现出的关系正是一一对应的关系,因为题目要求对于自愿者不同的选牌的方案,助手看到的牌必须不同。
前面已经提到过,从信息学的角度来看,一一对应,也可以看作是一种二分图的匹配的关系。因此,方案二更容易让人联系到匹配。
令X=自愿者的选牌的方案集,Y=助手看到的牌的,构造二分图G=(X,Y,E),当且仅当时,G中存在边xiyj。这样,就把原问题转换成求图G的一个完美匹配。
下面问题又来了。首先,二分图的顶点高达2M个,当N=15时,M接近,而求匹配的复杂度为O(M3),这样高的复杂度,如何能够承受?
注意到这个图是一个稀疏图,一共只有MN条边。而稀疏二分图匹配的复杂度也可以表示成O(|V|×|E|)。因此,时间复杂度应该是O(),基本上可以承受了。
另外,由于这是稀疏图,我们用邻接表来存储,则空间复杂度仅为O(NM),同样可以承受。
要说明的是,这道题目也可以用构造法以更好的效率,但不如匹配容易想到。具体的构造方法这里就不给出了,读者可以自己想一想。问题:OOPC-神秘之山
M个人在追一只奇怪的小动物。眼看就要追到了,那小东西却一溜烟蹿上一座神秘的山。众人抬头望去那山看起来就是这个样子:
图表7样例示意图
那山由N+1条线段组成。各个端点从左到右编号为0…N+1,即x<x[i+1](0≤i≤n)。而且有y[0]=y[n+1]=0。
根据经验来说那小东西极有可能在1…N中的某个端点。有趣的是大家很快发现了原来M恰好等于N,这样,他们决定每人选一个点,看看它是否在躲那里。
一开始,他们都在山脚下,第i个人的位置是(s,0)。他们每人选择一个中间点(x,0),先以速度w水平走到那里,再一口气沿直线以速度c爬到他的目的地。由于他们的数学不好,他们只知道如何选择一个的整数来作为中间点的横坐标x。而且很明显,路线的任何一个部分都不能在山的上方(他们又不会飞)。
他们不希望这次再失败了,因此队长决定要寻找一个方案,使得一个到达目的地的人尽量早点到。他们该怎么做呢?
其中1≤N≤,0≤x,y,s≤,1≤c<w≤。行包含一个整数N。以下N+2行每行,包含两个整数xi和yi,代表相应端点的坐标。以下N行每行包含3个整数:ci,wi和si,代表第i个人的爬山速度,行走速度和初始位置输出一个人到达目的地的最早可能时间,四舍五入到小数点后两位。
样例输入
样例输出
1.43
样例说明
在这里例子中,个人先到(5.0)再爬到端点2;第二个人直接爬到端点3;第三个人先到(4.0)再爬到端点1。如下图:
图表8样例的解答题目中的数据繁多复杂,我们先把他们提出来一个个分析:
人,共n个,与之有关的有初始横坐标s,速度w和c
山头,共n个,与之有关的有坐标x和y
根据这些信息,可以得到,人和山头的关系:t[I,J],表示第i个人到达山头j所需的最短时间。
题目中已经指明是一个人负责一个山头,这显然是一个一一对应的关系,因此,我们可以从二分图的匹配的角度来考虑这个问题。
那么,这道题目属于哪一种匹配呢?是简单的匹配,还是权匹配,或者是前面所提到的“完美”权匹配呢?
其实都不是。因为一般的权匹配,一个匹配的权的定义是该匹配中所有边上权的和,而这道题目,一个匹配的权是指该匹配的边上权值的值。题目要求这个值最小,我们暂且称之为“最小匹配”。
直接求解似乎不太方便。换一个角度,如果我们给出一个时间,就可以用完美匹配的算法来判断能否在这个时间内完成所有的工作。
具体的来说,对于给定的二分图G和时间T,我们可以导出新的图G’,G’中所有边的权都不超过T。如果G’存在完美匹配,则所有工作可以在T时间内完成,否则则不能。
这样,一个简单的算法就诞生了:依次增加T,知道求出一个完美匹配为止。由于二分图中的边不会超过n2,因此T最多增加n2次,而每次增加T的值,需要O(n2)的时间来找增广链,这样总的时间复杂度就是O(n4)。
我们还可以采用二分查找的方法来寻找这个T,这样的算法时间复杂度就可以降到为O()。
以上就是与两个人容貌上匹配程度相关内容,是关于两个人容貌上匹配程度的分享。看完两个人之间的匹配度后,希望这对大家有所帮助!