【题解】CF739D Recover a functional graph(构造+二分图匹配)

【题解】CF739D Recover a functional graph(构造+二分图匹配)

题目大意

一个图被称为F图当且仅当每个点出度为1。可以发现这个图是一个内向基环森林,给出所有点到它能到达的环(只会有一个)的距离dis和那个环的长度len,然而有些点的信息模糊了,用?代替,可以是任何数。现在你要输出一个合法的构造方案。

可以提炼出一个图是F图的条件:

  • 对应环的距离数组是自然数数列
  • \(len=k\)的点的个数是\(tk,t\in N^+\)

由于第二个条件只能用问号补,没有决策需要做,直接补上(也要用二分图匹配实现)。考虑如何满足第一个条件,可以每种长度的环选一个出来作为代表环其他可以丢掉,这样就没有选环的决策了,这样仍然可以构造合法解出来(若有多个dis=p,都连向dis=p-1的点就好了)。满足第一个条件关键在于dis最大的那个点,我们不去将\(dis=?\)的点变得比已有对应\(dis\)更大,因为这样肯定不优。

然而还有一个问题,\(len=?,dis=...\)的最大的dis,它去哪个地方匹配我们是不确定的,这个枚举一下就好了(只需要枚举一个,多个最大dis的当做多余的连到dis-1就行了)。

现在我们只有\((len=?,dis=...)\)和\((len=...,dis=?)\)的需要搞了,这部分可以二分图匹配做。

现在问题是自然数数列可能中间有些地方根本就没得,但我们只需要一个点就行了,就建立一排点进行匹配,匹配完成后看这一排点是否满流就行了。

原文地址:https://www.cnblogs.com/winlere/p/12273703.html

时间: 2024-10-07 21:01:14

【题解】CF739D Recover a functional graph(构造+二分图匹配)的相关文章

CF739D Recover a functional graph

Link 首先把所有的按环长分类,那么我们需要做的就是满足以下几个条件: \(1.\)每个环长的到环距离为\(0\)的点的个数应该是环长的倍数.当然只需要在最低限度下将其补齐即可. \(2.\)每个环长的到环距离必须是连续的. \(3.\)必须要有某个环去接受环长为\(?\)的距离最长的点. 那么我们可以枚举把环长为\(?\)的距离最长的点放在哪个长度的环,然后二分图匹配补齐\(1,2\)两条限制,多余出的点随便搞搞就完事了. #include<cstdio> #include<vect

【题解】 [ZJOI2009]假期的宿舍 (二分图匹配)

Solution: 处理出床位.要留校的人(注意来访问的人一定住校),和人与人的关系(连边) 再接着就是二分图. 注意的就是连向的人必须是有床位的 还要注意的就是只用判断住校的同学 二分图板子都打错蠢死 bool find(int k){ for(int i=head[k];i!=0;i=edge[i].nxt){ int v=edge[i].to;//cout<<k<<' '<<v<<endl; if(bed[v]!=1)continue; if(!vis

网络流24题 第一题 - 洛谷2756 飞行员配对方案 二分图匹配 匈牙利算法

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 题意概括 裸的二分图匹配 题解 匈牙利算法 上板子 代码 #include <cstring> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cmath> using namespace std; const int N=100+5; int m,n,a,b,match[N

codeforces 702E Analysis of Pathes in Functional Graph(倍增)

E. Analysis of Pathes in Functional Graph You are given a functional graph. It is a directed graph, in which from each vertex goes exactly one arc. The vertices are numerated from 0 to n - 1. Graph is given as the array f0, f1, ..., fn - 1, where fi 

【题解】 [NOI2009]变换序列 (二分图匹配)

懒得复制,戳我戳我 Solution: 这个题面出的很毒瘤,读懂了其实是个板子题qwq 题面意思:有个\(0\)至\(N-1\)的数列是由另一个数列通过加减得到的,相当于将\(A_i\)变成\(i\),每一步的代价计算就是\(min(A_i-i,N-(A_i-i))\),并且\(A_i\left(0<=i<N\right)\)互不相同,读入代价,要求字典序最小的满足要求的数列 我们设读入的为\(w[i]\) 思路其实很简单,\(i\)只可能是由\(i-w[i]\) 或者 \(i+w[i]\)

poj 3020 Antenna Placement(最大二分图匹配)

题意: N行M列的矩阵,每个格子里不是 * 就是 O . * :是一个利益点. O:是一个空白点. 每次可以用一个圈覆盖相邻的两个*.(左右相邻或上下相邻). 问最少需要多少个圈可以覆盖所有的*. 思路: 把每个格子变成一个数,总共有N*M个数.构造二分图,左右的数字都分别是1....N*M. 若两个*可以被一个圈覆盖,则将它们对应在左边.右边的点连上线. 答案即为:*的总数 - 最大二分匹配的值/2(因为有一半是对称的). 代码: int T,n,m; vector<int> graph[4

HDU_1507_Uncle Tom&#39;s Inherited Land*(二分图匹配)

Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2208    Accepted Submission(s): 913 Special Judge Problem Description Your old uncle Tom inherited a piece of land fr

HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流

二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示编号为c的女生和编号为d的女生是朋友 6 // 7 //进行配对的要求满足其一即可. 8 //1.a女生没有和b男生吵过架 9 //2.a女生的朋友和b男生没有吵过架 10 // 11 //每进行一轮之后重新配对,配过得一对不可再配,问最多能进行几轮. 12 // 13 //题解: 14 //这一道

棋盘游戏(二分图匹配)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3200    Accepted Submission(s): 1897 Problem Description 小 希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放