题目大意:给出一个二分图的完美匹配(王子和公主的烧死名单表),二分图x部和y部均只有n个点,问对于每一个x部的点,他能选择哪些点与之匹配 使得与之匹配后,剩余图的最大匹配仍然是n

思路:这题是大白书379页二分图的压轴题,在图论刷的题还不多时思考过这题,现在想来也不难想

这题引人瞩目的一点便是预先给出了一个二分图的初始匹配

对每个点枚举后增广显然不怎么可行,那么还是图论问题的经典思考方式,点和边各表示什么

题目的输入天然的给出了一个图,但对这题好像没什么用处,于是开始思考把给出的初始匹配的每条边看成一个点!!!

那样构成的图每个点就是一个王子和一个公主的配对,如果一个王子还可以花心爱上除了初始匹配的公主外的其他公主,那么从这个点向那个公主处连一条边

然后显然新构成的图中如果有环,(A到B,B又可以到A),那么我们就可以把原来二分图中的匹配顺次沿一格(形象一点就是环中的王子们顺次把自己初始匹配的姑娘送给下一个王子),这样肯定不改变二分图的最大匹配数

然后联想到在一个强连通分量里面,任意两点间肯定是有环的,因此可以缩点,一个SCC里的姑娘肯定可以取到的,不在一个SCC里的姑娘由于是DAG 所以不可能存在环,因此无论如何也取不到

然后就A了,输出的时候得递增 因此贡献了发WA

#include<cstdio>

#include<string.h>

#include<iostream>

#include<algorithm>

#define maxn 600090

using namespace std;

int head[maxn],next[maxn],point[maxn],now=0;

int stack[maxn],top,col,dfn[maxn],low[maxn];

int tim,belong[maxn],x[maxn],y[maxn];

int match[maxn],ans[maxn],h=0,idx=0;

bool instack[maxn];

void add(int x,int y)

{

next[++now]=head[x];

head[x]=now;

point[now]=y;

}

void tarjan(int k)

{

stack[++top]=k;

dfn[k]=low[k]=++tim;

instack[k]=1;

for(int i=head[k];i;i=next[i])

{

int u=point[i];

if(dfn[u]==0)

{

tarjan(u);

low[k]=min(low[k],low[u]);

}

else if(instack[u]==1)

{

low[k]=min(low[k],low[u]);

}

}

if(dfn[k]==low[k])

{

col++;

int u;

do

{

u=stack[top--];

belong[u]=col;

instack[u]=0;

}while(u!=k);

}

}

int main()

{

int n,k,tt;

scanf("%d",&n);

for(int i=1;i<=n;i++)

{

scanf("%d",&k);

for(int j=1;j<=k;j++)

{

scanf("%d",&tt);

x[++h]=i;y[h]=tt;

}

}

for(int i=1;i<=n;i++)

{

scanf("%d",&tt);

match[tt]=i;

}

for(int i=1;i<=h;i++)

{

if(match[y[i]]!=x[i])

{

add(x[i],match[y[i]]);

}

}

for(int i=1;i<=n;i++)if(dfn[i]==0)tarjan(i);

for(int i=1;i<=n;i++)

{

int hh=0;

while(x[idx+1]==i && idx+1<=h)

{

idx++;

if(belong[i]==belong[match[y[idx]]])

ans[++hh]=y[idx];

}

printf("%d",hh);

sort(ans+1,ans+1+hh);

for(int i=1;i<=hh;i++)

{

printf(" %d",ans[i]);

}

printf("\n");

}

return 0;

}

POJ 1904:King's Quest【tarjan】的更多相关文章

  1. LeetCode:组合总数III【216】

    LeetCode:组合总数III[216] 题目描述 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. ...

  2. LeetCode:路径总和II【113】

    LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...

  3. LeetCode:括号的分数【856】

    LeetCode:括号的分数[856] 题目描述 给定一个平衡括号字符串 S,按下述规则计算该字符串的分数: () 得 1 分. AB 得 A + B 分,其中 A 和 B 是平衡括号字符串. (A) ...

  4. LeetCode:组合总数II【40】

    LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...

  5. LeetCode:整数转罗马数字【12】

    LeetCode:整数转罗马数字[12] 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 10 ...

  6. LeetCode:矩阵置零【73】

    LeetCode:矩阵置零[73] 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   ...

  7. LeetCode:下一个排列【31】

    LeetCode:下一个排列[31] 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排 ...

  8. LeetCode:杨辉三角【118】

    LeetCode:杨辉三角[118] 题目描述 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5 输出: ...

  9. LeetCode:罗马数字转整数【13】

    LeetCode:罗马数字转整数[13] 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 10 ...

随机推荐

  1. java中stringBuilder的用法

    java中stringBuilder的用法 String对象是不可改变的.每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需 ...

  2. 【C#】枚举

    枚举 public static class CommonEnums { public enum people { /// <summary> ///男人 /// </summary ...

  3. linux小白成长之路13————用U盘安装linux服务器

    [内容指引] 制作CentOS安装引导盘: 安装CentOS: 相关设置: 一.制作CentOS安装引导盘 1.下载安装镜像文件 从官网下载iso文件: 网址:https://www.centos.o ...

  4. [转]Intellij Idea自动添加注释的方法

    Intellij Idea自动添加注释的方法 阿历Ali 关注 2017.08.20 21:22* 字数 914 阅读 2741评论 0喜欢 6 程序媛阿历终于要写第一篇关于开发的文章了!!! 阿历用 ...

  5. B树、B+树、红黑树、AVL树

    定义及概念 B树 二叉树的深度较大,在查找时会造成I/O读写频繁,查询效率低下,所以引入了多叉树的结构,也就是B树.阶为M的B树具有以下性质: 1.根节点在不为叶子节点的情况下儿子数为 2 ~ M2. ...

  6. [译] 用win7自带工具找出svchost.exe的CPU使用率达到100%的元凶

    本文是我对自己上一篇转载的博客 <Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Wind ...

  7. 如何用Chrome自带的截屏功能截取超过一个屏幕的网页

    提升程序员工作效率的工具/技巧推荐系列 推荐一个功能强大的文件搜索工具SearchMyFiles 介绍一个好用的免费流程图和UML绘制软件-Diagram Designer 介绍Windows任务管理 ...

  8. docker 新手入门 (web项目的部署)

    web项目的部署 1.首先我们下载centos镜像.docker pull centos 2.下载完成之后,我们首先要安装的是java环境  tomcat 和jdk 3.将下载好的软件放入到nmt目录 ...

  9. 必知干货:Web前端应用十种常用技术你全都知道吗?

    Web前端应用十种常用技术,随着JS与XHTML的应用普及,越来越多的web界面应用技术出现在网站上,比如我们常见的日历控件,搜索下拉框等,这些web界面应用技术大大的丰富了网站的表现形式,本文将为您 ...

  10. QT_3

    1.QT中命名的规范和常用的快捷键 1.1 命名规范: 类名:首字母大写    多个单词时单词与单词之间首 字母大写 函数名:变量名称   首字母小写    多个单词时,单词和单词之间首字母大写 1. ...