题意:

  很久很久以前..

  有一个国王..

  他有好几个儿子..

  这些王子都喜欢上了邻国的公主..

  他们准备迎娶自己喜欢的公主中的一个..

  国王就让宰相给列一个清单..

  

  宰相就给了国王一个清单..上面写明了哪个王子将迎娶哪个邻国的公主..

  但是调皮的国王不太满意~~

  他还想知道他的儿子分别可以迎娶哪几个公主中的一个而不会让他的兄弟因此而吃醋..

  所以宰相又得重新写清单了..

  噢..对了~邻国的公主和王子人数一样多~<这是一个奇怪的国家..>

  输入:

  一个n表示有n个王子..

  接下来n行每行有一个m表示第i个王子喜欢m个公主..

  然后给出m个公主的序号..

  最后一行有n个数..代表第i个王子最后迎娶了的公主..

  输出:

  n行..每行第一个是m 表示有m个公主他可以选择~

  然后m个数是公主的序号..

  P.S 麻烦的国王还要求公主序号按从小到大给出..

<这是一些花心的王子..= =!! 可恨..>

 

思路:

  求强连通分量..

  王子和喜欢的公主连边..

  最后娶了的公主和该王子之间也连边..

  然后每个强连通分量就是他可以选择的公主序号..

 

Tips:

  因为类似拆点了..所以数组要开大一点..

 

Code:

View Code

  1 #include <stdio.h>
  2 #include <cstring>
  3 #include <algorithm>
  4 using namespace std;
  5 const int INF = 0x1f1f1f1f;
  6 #define clr(x) memset(x, 0, sizeof(x))
  7 const int MAXN = 2010*3;
  8
  9 struct Edge
 10 {
 11     int to;
 12     int next;
 13 }edge[10000010];
 14 int head[MAXN];
 15 int tot;
 16
 17 void add(int s, int u)
 18 {
 19     edge[tot].to = u;
 20     edge[tot].next = head[s];
 21     head[s] = tot++;
 22 }
 23
 24 int dfn[MAXN], low[MAXN];
 25 int ins[MAXN], sta[MAXN], col[MAXN];
 26 int ti, top, cnt;
 27 int n;
 28
 29 void tarjan(int u)
 30 {
 31     int i, k;
 32     dfn[u] = low[u] = ++ti;
 33     ins[u] = 1;
 34     sta[++top] = u;
 35     for(i = head[u]; i != -1; i = edge[i].next) {
 36         k = edge[i].to;
 37         if(dfn[k] == 0) {
 38             tarjan(k);
 39             low[u] = min(low[u], low[k]);
 40         } else if(ins[k]) {
 41             low[u] = min(low[u], dfn[k]);
 42         }
 43     }
 44     if(dfn[u] == low[u]) {
 45         cnt++;
 46         do
 47         {
 48             k = sta[top--];
 49             col[k] = cnt;
 50             ins[k] = 0;
 51         }while(u != k);
 52     }
 53
 54 }
 55
 56 void solve()
 57 {
 58     int i, k;
 59     ti = top = cnt = 0;
 60     clr(dfn);
 61     for(i = 1; i <= n; ++i)
 62         if(!dfn[i])
 63             tarjan(i);
 64 }
 65
 66 int main()
 67 {
 68     int i, j, k;
 69     int a, m;
 70     int mar;
 71     int ans[MAXN];
 72     while(scanf("%d", &n) != EOF)
 73     {
 74         tot = 0;
 75         memset(head, 0xff, sizeof(head));
 76
 77         for(i = 1; i <= n; ++i) {
 78             scanf("%d", &m);
 79             while(m--) {
 80                 scanf("%d", &a);
 81                 add(i, a+n);
 82             }
 83         }
 84         for(i = 1; i <= n; ++i) {
 85             scanf("%d", &mar);
 86             add(mar+n, i);
 87         }
 88
 89         solve();
 90
 91         int tmp;
 92         for(i = 1; i <= n; ++i) {
 93             tmp = 0;
 94             for(j = head[i]; j != -1; j = edge[j].next) {
 95                 k = edge[j].to;
 96                 if(col[i] == col[k])
 97                     ans[tmp++] = k;
 98             }
 99             sort(ans, ans+tmp);
100             printf("%d", tmp);
101             for(j = 0; j < tmp; ++j)
102                 printf(" %d", ans[j]-n);
103             puts("");
104         }
105     }
106     return 0;
107 }

 

题目链接:http://poj.org/problem?id=1904

转载于:https://www.cnblogs.com/Griselda/archive/2012/10/05/2711974.html

POJ 1904 【强连通分量】.cpp相关推荐

  1. poj 2186 强连通分量

    poj 2186 强连通分量 传送门 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 33414 Acc ...

  2. poj 2186(强连通分量)

    题意: n头奶牛,给出若干个欢迎关系a b,表示a欢迎b,欢迎关系是单向的,但是是可以传递的,如:a欢迎b,b欢迎c,那么a欢迎c .另外每个奶牛都是欢迎他自己的.求出被所有的奶牛欢迎的奶牛的数目. ...

  3. 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 ...

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

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

  5. poj 1904 tarjan强连通分量(给国王的2000个儿子找老婆 )

    题意:有n个王子,每个王子i有ki个他喜欢的妹子,每个王子只能和喜欢的妹子结婚,大臣给出一个匹配表(假设肯定是对的),每个王子都和一个妹子结婚,但是国王不满意,他要求大臣给他另一个表,每个王子可以和几 ...

  6. 有向图 加最少的边 成为强连通分量的证明 poj 1236 hdu 2767

    poj 1236: 题目大意:给出一个有向图, 任务一: 求最少的点,使得从这些点出发可以遍历整张图  任务二: 求最少加多少边 使整个图变成一个强连通分量. 首先任务一很好做, 只要缩点 之后 求 ...

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

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

  8. POJ 2186 挑战 --牛红人 强连通分量——Tarjan

    题意:n头奶牛,给出若干个欢迎关系a b,表示a欢迎b,欢迎关系是单向的,但是是可以传递的,如:a欢迎b,b欢迎c,那么a欢迎c .另外每个奶牛都是欢迎他自己的.求出被所有的奶牛欢迎的奶牛的数目.#i ...

  9. POJ 1236 Network of Schools(强连通分量缩点求根节点和叶子节点的个数)

    Description: A number of schools are connected to a computer network. Agreements have been developed ...

最新文章

  1. Minor GC、Major GC和Full GC之间的区别(转)
  2. ie8 script445: 对象不支持此操作_经验总结:上海增值税认证勾选安装和操作步骤...
  3. Spring boot删除员工
  4. hdu 1080(LCS变形)
  5. c语言ecit,Arthritis Rheumatol:新型JAK3/TEC抑制剂PF-06651600(ritlecitinib)对中重度类风湿性关节炎的疗效和安全性...
  6. Android之如果解决Android studio项目里面的类名不能重命名
  7. spring mvc学习(33):原生apiSpring MVC过滤器-HiddenHttpMethodFilter
  8. mysql多条数据合并一条之后取出重复值
  9. 浅谈安全攻防场景下面的安全检测
  10. C语言:大小字母转换(ASCII码)
  11. Redis常用命令总结,为什么阿里的程序员成长如此之快
  12. python自动翻译视频字幕_利用 谷歌 python 快速翻译 英文字幕
  13. 如何批量在图片上加文字?
  14. 2018计算机专硕学硕,2018考生快上车!专硕VS学硕,究竟怎么选?
  15. 这是我网店的链接欢迎来看看
  16. 利用js写一个函数,实现翻转任意数组。 写一个函数,实现对数字数组的排序。
  17. 利用PDF编辑软件给PDF添加页码的操作全过程
  18. 解决git错误: error: The following untracked working tree files would be overwritten by merge
  19. 互联网---张鑫旭---读了张大大的好多博客了(自己小有心得) 怀着感恩的心来写
  20. [Demo示例]爬取豆瓣FM个人收藏歌曲“红心列表”

热门文章

  1. matlab找不到函数系统函数,求助,Matlab找不到ztrans函数
  2. volatile指令重排_有多少人面试栽到Volatile上?面试问题都总结到这儿了
  3. flo file_Flo菜单简介:可扩展的拇指友好型移动导航
  4. 使用nmcli 实现 bond0 网络组 网桥三种模式
  5. cannot find -lunwind-x86_64
  6. usr/bin/expect方式免密码登录和发送文件脚本
  7. 关于Java开发需要注意的十二点流程
  8. android 8种对话框(Dialog)使用方法汇总
  9. Python中如何把一个UTC时间转换为本地时间
  10. POJ 3264 Balanced Lineup(RMQ)