题目大意:给出一个二分图的完美匹配(王子和公主的烧死名单表),二分图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. PHP的加密方式

    1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str  --  原始字符串. raw_output  --  ...

  2. 前端之CSS语法及选择器

    一.css语法: css由两大部分组成:选择符和声明,声明由属性和属性值两部分组成; 选择符{属性:属性值;属性:属性值;} 注: a) 属性和属性值之间用冒号连接: b)每条声明结束要加分号: 二. ...

  3. AJPFX总结heap和stack有什么区别?

    栈是后进先出的线性表结构,存取速度比堆快.创建对象的时候new一个对象,引用存在栈上具体的内容存在堆上. 栈与堆都是Java用来在RAM中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不 ...

  4. 【经验总结】OSG 安装配置

    对于普通用户推荐直接下载安装包配置.如有特殊需求或想了解编译过程可参考网上文章自己编译后配置.(通常建议使用第一种方法即可) 本人安装经验: 失败:自己系统64位,VS2010 32位,开始自己动手编 ...

  5. 最新版kubernetesV1.14.1集群一键自动部署脚本

    部署命令如下:详情及注意事项请看README.md git clone https://github.com/luckman666/deploy_Kubernetes-v1.14.1.git cd d ...

  6. 如何在win7、win8、win8.1上安装使用vb6.0

    https://jingyan.baidu.com/article/915fc414fdf8fb51384b2062.html如何在win7.win8.win8.1上安装使用vb6.0 如何在win7 ...

  7. centos启用socks5服务

    直接在终端用 root 安装 *** 官方客户端 apt-get install python-pip -ypip install shadowsocks 然后编辑 /etc/shadowsocks. ...

  8. 数据库管理系统X

    大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约 ...

  9. mysql 增删查改

    非关系型数据库关系型数据库Oracle mysql sqlserver db2 Postgresql Sqlite access sqlserver 微软db2 ibm================ ...

  10. Python3基础教程(十五)—— PEP8 代码风格指南

    编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的. 这篇文章原文实际上来自于这里:https://www.python.org/dev/peps/pep-0008/ 有很 ...