POJ1904 King's Quest

2023-11-05 14:32
文章标签 king quest poj1904

本文主要是介绍POJ1904 King's Quest,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

POJ1904 King’s Quest

分析

题目大意:

有n个王子和n个妹子,王子可能会喜欢多个妹子,现在这些王子要跟自己喜欢的妹子结婚。
给出一个可行的婚配方案(完美匹配),要求所有的可行匹配,使得:每个王子与求得方案中的某一个妹子结婚后,其他喜欢这个妹子的王子仍有其他婚配方案。

(不可行)思路1:

乍一看上去像是二分图匹配。显然,所有妹子与王子都要结婚,没有重婚、没有单身,即“不重不漏“”。那么我们可以通过二分图匹配,不断寻找增广路,每次记录可行匹配,最后枚举给定方案中的每个王子的妹子进行判断。
复杂度应该是 O(nm2) O ( n ⋅ m 2 ) ,显然TLE。

(不可行)思路2:

我们发现给出的完美匹配还没有用上。思考一下它的用处?不妨在建完二分图后,让给定方案中的妹子向该王子连一条边。观察性质,发现每一些“王子——妹子——王子……”的路径就类似于二分图匹配中的增广路,如果我们按照这写路径不断走下去,相当于模拟了匹配的过程。
可这样只是优化了匈牙利算法递归的时间,仍然TLE。

(可行)思路3:

如果跳出“二分图”这一思维定势,我们不妨尝试其他做法。在思路2的建图过后,我们还可以发现:在每一强连通分量里的王子们,可以通过“强连通分量内部调节”与其他妹子婚配,并且保证联通块内王子和妹子不重不漏。但为什么呢?
首先,根据思路1的“不重不漏”分析,因为一个妹子可以由多个王子连过来,但每个妹子只连向一个王子,一旦形成强联通分量,就意味着大致形成下图所示的情况:(红线表示二分图边,黄线表示后加的边,左边为王子,右边为妹子)
这里写图片描述
这样,王子可以通过(黄——红——红)找到另一个妹子,妹子可以通过(红——红——黄)找到另一个王子,这样保证了更改后的方案合法。
至于 = 妹 子 数 = 王 子 数 ,此处反证:若多了几个妹子,那这些妹子也就没有黄色边,也就没法找到另一个可匹配的王子,也就没有刚才描述的路线,不符合题设。多几个王子的情况同理。
思路十分明朗了。建图,缩点,对于每个王子,枚举处在同一强连通分量里的妹子记录答案。

代码

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=4004,maxm=200002;
struct Edge{int to,next;
}e[maxm+maxn];
int head[maxn],blt[maxn],sta[maxn],dfn[maxn],low[maxn],ans[maxn/2];
bool love[maxn/2][maxn/2];
int n,cnt,top,dfc,rpg;void add(int u,int v)
{e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;
}void tarjan(int u)
{dfn[u]=low[u]=++dfc;sta[++top]=u;for(int i=head[u];i;i=e[i].next){int v=e[i].to;if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(!blt[v])low[u]=min(low[u],dfn[v]);}if(low[u]==dfn[u]){rpg++;while(1){int x=sta[top--];blt[x]=rpg;if(x==u)break;}}
}int main()
{scanf("%d",&n);for(int i=1,t,x;i<=n;i++){scanf("%d",&t);while(t--){scanf("%d",&x);add(i,x+n);love[i][x]=true;}}for(int i=1,x;i<=n;i++){scanf("%d",&x);add(x+n,i);}for(int i=1;i<=(n<<1);i++)if(!dfn[i])tarjan(i);for(int i=1;i<=n;i++){int sum=0;for(int j=1;j<=n;j++)if(blt[i]==blt[j+n]&&love[i][j])ans[++sum]=j;printf("%d ",sum);for(int i=1;i<=sum;i++)printf("%d ",ans[i]);printf("\n");}return 0;
}

这篇关于POJ1904 King's Quest的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【POJ】2728 Desert King 最优比率生成树——01分数规划【经典】

最近在刷巨巨们放出来的专题,然后没做几题就卡住了,果然还是太弱了T U T... 这次做到了一题01分数规划求解的生成树问题。 题目大意是这样的:给你一个无向完全图,每条边i都有两个权值,长度a[ i ],花费b[ i ],需要选出其中的一些边构造一颗生成树,生成树需要满足条件:∑ b [ i ] / ∑ a [ i ]最小。 这样我还是先来介绍一下01分数规划吧~ 给定一个上述的问

【HDU】3861 The King’s Problem 强连通缩点+有向图最小路径覆盖

传送门:【HDU】3861 The King’s Problem 题目分析:首先强连通缩点,因为形成一个环的王国肯定在一条路径中,这样才能保证拆的少。 然后缩点后就是DAG图了,由于题目要求的是最小路径覆盖,那么二分匹配即可。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>#includ

【贪心】codeforces30D King‘s problem

直接上中文题面 King's Problem? 时间限制:3.0s  内存限制:256.0MB   Special Judge 问题描述   每一个真正的国王在他的一生中,一定会征服世界,取得 codeforces 的世界冠军,在射击场赢得粉色的熊猫(= =),并游历整个王国。   国王 Copa 已经完成了前三件事。现在他只需要游历完整个王国了。他的王国在一个无限大的笛卡尔坐标系上,每

非常有趣的一道区块连CTF题目的思考————king

区块连CTF题目 区块连CTF题目king 区块连CTF题目前言一、题目以及解答二、题目分析1.进攻receive()函数2.守护king强行selfdestruct转入为什么拿不到king 前言 这道题目在于处理接受函数的知识,另外我们结合selfdestruct函数进行分析 一、题目以及解答 这是一个非常有意思的问题: 首先下面的solidity代码是本次的题

HDU 3861 The King’s Problem

http://acm.hdu.edu.cn/showproblem.php?pid=3861 The King’s Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1828    Accepted Submission

Lesson 73 The way to King Street

Lesson 73 The way to King Street 词汇 week n. 周 = 7 days 相关:weekend 周末    weekday 工作日    weekly adv. 一周一次的    = once a week 例句:一周有七天。    There are seven days in a week. days of the week: Monday 星期一 T

Unity Meta Quest 开发:关闭 MR 应用的安全边界

社区链接: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 📕教程说明 这期教程我将介绍如何在应用中关闭 Quest 系统的安全边界。 视频讲解: https://www.bilibili.com/video/BV1Gm42157Zi 在 Unity 中导入 Meta XR SDK,进行环境配置后,打开 Assets > Plugins > An

To-King战地日记(之二)

其实我不想告诉大家,在我这篇战地日记之前,我们战队的马姐还有一篇ToKing战地日记,原因是这厮的战地日记让我觉得我头上顶着一个山大的鸭梨。但我还是告诉大家了,为什么呢?因为那篇战地日记介绍了我们战队的每一个成员?因为那是我们战队的第一篇战地日记?还是因为……?其实我只是想让你们知道知道什么是ws。         好吧,说正题。今天我要说的就是我自己前半半(请不要怀疑我多打字了)生的梗概,虽然马

Unity Meta Quest 开发:与 Unity 的 UI 系统进行交互

文章目录 📕教程说明📕教程内容概括📕添加玩家物体📕添加 Canvas 物体和 EventSystem 物体📕修改 Canvas 组件的 Render Mode📕在 Canvas 上搭建 UI 面板📕利用 Interaction SDK 的 Quick Action 快速配置交互功能📕按钮点击事件 此教程相关的详细教案,文档,思维导图和工程文件会放入 Spatial

POJ-1904 King's Quest 强连通分量求完美匹配

http://poj.org/problem?id=1904 题目意思:有n个女生和n个男生,给定一些关系表示男生喜欢女生(即两个人可以结婚),再给定一个初始匹配,表示这个男生和哪个女生结婚,初始匹配必定是合法的.求每个男生可以和哪几个女生可以结婚其他人还难能都找个女生结婚。 思路:第一反应还以为是求二分完美匹配,百度题解再知道用连通分量 0.0  将男生从1到n编号,女生从(n+1)到2*n