King's Quest

题意:有N个王子和N个妹子;(1 <= N <= 2000)第i个王子喜欢Ki个妹子;(详见sample)题给一个完美匹配,即每一个王子和喜欢的一个妹子结婚;问每一个王子可以有几种选择(在自己喜欢的妹子里面选),并输出可选的妹子的标号(升序);

Sample Input

4 (N)
2 1 2  (Ki)
2 1 2
2 2 3
2 3 4
1 2 3 4 (完美匹配)

Sample Output

2 1 2
2 1 2
1 3
1 4

分析:图匹配问题,1~N为王子的编号,N~2N为妹子的编号;输入有向边;

重点: 对于给定的一组匹配,看做是反向边;即从妹子指回到王子;这样进行Tarjan缩点之后,就可以遍历边(要在王子喜欢的妹子的选...)看是否还在同一个强连通分量中,若妹子还是和王子在同一个scc中,即可婚配;

证明:为什么说还在一个强连通分量中就可以?边一定是连接王子和妹子的,在不重复走一条边的前提下,会知道王子和妹子的个数是相同的;并且每条边都符合王子喜欢妹子的条件;

ps:该题第一次使用了输出外挂,很好用啊!!时间之间减了至少1/10...

思维坑点:认为可以直接在Tarjan缩点时,就把每个强连通分量里面的妹子写入vec[]中;这样之后就可以直接对每个vec排序之后,之后调用belong[]输出所在的scc的个数即妹子的编号。。想法是好的,但是题意啊!!!并不是在一个连通分量的妹子都是这样王子喜欢的。。。所以要遍历边,找到在一个连通分量里面的;

// 532ms
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<stack>
#include<set>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define pb push_back
template<typename T>
void read(T &m)
{T x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}m = x*f;
}
template<typename T>
void out(T a)
{if(a>9) out(a/10);putchar(a%10+'0');
}
const int N = 2020<<1;//倍增点数
const int M = 202200;
int head[M],tot;
struct edge{int to,w,Next;
}e[M];
void ins(int a,int b,int w = 0)
{e[++tot].Next = head[a];e[tot].to = b;e[tot].w = w;head[a] = tot;
}
int pre[N],dfs_clock,low[N];
int belong[N],scc,n;
stack<int> S;
bool stk[N];
void Tarjan(int u)
{pre[u] = low[u] = ++dfs_clock;S.push(u);stk[u] = true;int v;//点u所在连通分量的出度;for(int i = head[u];i;i = e[i].Next){v = e[i].to;if(pre[v] == 0){Tarjan(v);low[u] = min(low[u],low[v]);}else if(stk[v]){low[u] = min(low[u],pre[v]);}}if(pre[u] == low[u]){//强连通分量的根节点++scc;do{v = S.top();S.pop();stk[v] = false;//if(v <= n)belong[v] = scc;//else vec[scc].pb(v);}while(v != u);}
}
int ans[N];
int main()
{int v,T,kase = 1;read(n);rep1(u,1,n){int k;read(k);rep0(j,0,k){read(v);ins(u,v+n);//妹子标号要加上n;
        }}rep1(u,1,n){read(v);ins(v+n,u);//反向边***
    }rep1(u,1,n)if(pre[u] == 0)Tarjan(u);rep1(u,1,n){int cnt = 0;for(int i = head[u];i;i = e[i].Next){//遍历边v=e[i].to;if(belong[u] == belong[v])   //同一个强连通分量ans[cnt++] = v-n;}sort(ans,ans+cnt);out(cnt);rep0(i,0,cnt){putchar(' ');out(ans[i]);}puts("");}return 0;
}

View Code

转载于:https://www.cnblogs.com/hxer/p/5186495.html

poj 1904 King's Quest相关推荐

  1. poj 1904 King's Quest 强连通分量+匹配

    ========== 题目链接King's Quest ============ 题解:通过原有的完美匹配,反向建边,在同一个强连通分量里面的王子和公主可以匹配,而不影响其他王子的结婚对象. //#i ...

  2. POJ 1904 King's Quest(强连通分量)

    题目链接 Description Once upon a time there lived a king and he had N sons. And there were N beautiful g ...

  3. POJ - 1904 King's Quest 强连通tanjar思想

    传送门 题意:每个儿子都喜欢许多女孩,问每个渣男儿子最多有几个可以选择备胎.他爹也挺渣.. 猛地一看,哇二分匹配,但是想了想输入输出都能卡时间的题目,循环暴力二分匹配必T无疑,在做强连通模块的题所以想 ...

  4. POJ 1904 King's Quest(强连通图)题解

    题意:n个王子有自己喜欢的ki个公主,有n个公主,每个王子只能娶一个自己喜欢的公主且不能绿别的王子.现在给你一种王子娶公主的方案,并且保证这种方案是正确的.请你给出,每个王子能娶哪些公主,要求娶这些公 ...

  5. POJ - 1904 King's Quest(强连通缩点)

    题目链接:点击查看 题目大意:给出n个王子和n个公主,每个王子都有喜欢的公主,每个王子初始时都娶到了一位喜欢的公主,题目需要我们求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后,其他的王 ...

  6. POJ 1904 【强连通分量】.cpp

    题意: 很久很久以前.. 有一个国王.. 他有好几个儿子.. 这些王子都喜欢上了邻国的公主.. 他们准备迎娶自己喜欢的公主中的一个.. 国王就让宰相给列一个清单.. 宰相就给了国王一个清单..上面写明 ...

  7. POJ 1364 King 差分约束系统

    Description Once, in one kingdom, there was a queen and that queen was expecting a baby. The queen p ...

  8. UVA1327 King‘s Quest(强连通分量、给王子们匹配公主系列 - 1 )

    让我们首先来考虑建图 如果王子u喜欢妹子v那我们可以从u向v连一条有向边 如果妹子v可以与王子u配对(即在配对表上),那我们可以从v向u连一条有向边 对于样例 如果王子和另一个姑娘在同一个连通分量上, ...

  9. POJ 1364 King (差分约束系统)

    题目描述有点复杂,前面讲了一大堆废话. 题目大意:对一个含n个整数的序列进行一些约束: 1.整数序列中连续的一段的和大于某个整数: 2.整数序列中连续的一段的和小于某个整数. 问满足以上约束的整数序列 ...

最新文章

  1. 在预装win8的电脑上换win7系统讲解
  2. sql 去除字段前后空格
  3. BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)
  4. 【Python爬虫学习笔记11】Queue线程安全队列和GIL全局解释器锁
  5. php菲波那切数列,php如何实现菲波那切数列
  6. c++进制转换代码_轻松实现C/C++各种常见进制相互转换,你还不会你就落后了
  7. 3V、5V混合系统中不同电平器件接口的4种情况
  8. 数据库备份工具mysqldump重要参数详解
  9. 富文本(vue3)SQL格式化 JSON格式化
  10. 用友套打的打印机型号
  11. Android 分贝测试仪功能,挥泪整理面经
  12. 炫酷的时间样式HTML,js动态炫酷数字时钟
  13. VMware虚拟机Mac OS X 扩展内存方法
  14. 共享打印机提示服务器没有运行,提示无法共享打印机: “无法显示该属性,后台打印程序服务未运行”...
  15. 千挂科技与东风柳汽达成前装量产合作,2024年交付自动驾驶牵引车
  16. win7原版安装版系统
  17. bugtraq mysql,Oracle MySQL Server远程安全漏洞(CVE-2017-3459)
  18. 大类资产配置(一)均值方差模型MOV
  19. CSS 仿 iOS 系统通知数字样式
  20. 入门python爬虫

热门文章

  1. 网络管理员比赛回顾02-网关、静态路由、动态路由
  2. 导入语句 python_Python导入语句说明
  3. java ruby_Java,Ruby和Go,我的天哪!
  4. 手动部署OpenStack环境(一:Virtual Box 5.1 环境的安装及配置)
  5. linux pps 包 网卡,linux下安装PPS
  6. 5 zabbix 添加host_运维监控实战篇,zabbix自动发现和自动注册图文详解
  7. java培训教程分享:Java中怎样将数据对象序列化和反序列化?
  8. 女士做软件测试的利弊有哪些?
  9. 使用阿里云发布分布式网站,开发时候应该注意什么?
  10. Docker配置指南系列(二):指令集(二)