POJ1904 强联通(最大匹配可能性)
题意:
      有n个王子,n个公主,然后给你每个王子喜欢的公主,最后问你在不影响最大匹配的前提下,每个王子可以匹配那些公主。
思路:
是hdu4685的减弱版,之前研究过hdu4685所以这个题目直接水过了,对于这个题目,我们把王子和他喜欢的公主之间建连边,建立一个二分图,然后对于题目给的已经匹配好了的(有的题目没给,直接就自己跑一边二分匹配自己找),之间建立反边,就是建立公主到王子的边,然后一遍强联通,如果同意个分量里的男女可以匹配。这样记录每一个然后sort一下就行了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#define N_node 5000
#define N_edge 1000000
using namespace std;
typedef struct
{
   int to ,next;
}STAR;
STAR E1[N_edge] ,E2[N_edge];
int list1[N_node] ,list2[N_node] ,tot;
int Belong[N_node] ,cont;
int mark[N_node];
int ans[N_node];
stack<int>st;
void add(int a ,int b)
{
    E1[++tot].to = b;
    E1[tot].next = list1[a];
    list1[a] = tot;
    E2[tot].to = a;
    E2[tot].next = list2[b];
    list2[b] = tot;
}
void DFS1(int s)
{
    mark[s] = 1;
    for(int k = list1[s] ;k ;k = E1[k].next)
    {
       int to = E1[k].to;
       if(!mark[to]) DFS1(to);
    }
    st.push(s);
}
void DFS2(int s)
{
   mark[s] = 1;
   Belong[s] = cont;
   for(int k = list2[s] ;k ;k = E2[k].next)
   {
       int to = E2[k].to;
       if(!mark[to]) DFS2(to);
   }
}
int main ()
{
    int n ,i ,j ,a ,nn;
    while(~scanf("%d" ,&n))
    {
       memset(list1 ,0 ,sizeof(list1));
       memset(list2 ,0 ,sizeof(list2));
       tot = 1;
       for(i = 1 ;i <= n ;i ++)
       {
           scanf("%d" ,&nn);
           for(j = 1 ;j <= nn ;j ++)
           {
               scanf("%d" ,&a);
               add(i ,a + n);
           }
       }
       for(i = 1 ;i <= n ;i ++)
       {
          scanf("%d" ,&a);
          add(a + n ,i);
       }
       memset(mark ,0 ,sizeof(mark));
       while(!st.empty()) st.pop();
       for(i = 1 ;i <= n + n ;i ++)
       {
           if(!mark[i]) DFS1(i);
       }
       memset(mark ,0 ,sizeof(mark));
       cont = 0;
       while(!st.empty())
       {
           int to = st.top();
           st.pop();
           if(!mark[to])
           {
              cont ++;
              DFS2(to);
           }
       }
       for(i = 1 ;i <= n ;i ++)
       {
           int tt = 0;
           for(int k = list1[i] ;k ;k = E1[k].next)
           {
              int to = E1[k].to;
              if(Belong[i] == Belong[to])
              ans[++tt] = to - n;
           }
           sort(ans + 1 ,ans + tt + 1);
           printf("%d" ,tt);
           for(j = 1 ;j <= tt ;j ++)
           printf(" %d" ,ans[j]);
           puts("");
       }
    }
    return 0;
}
           												
											POJ1904 强联通(最大匹配可能性)的更多相关文章
- HDU 4685 Prince and Princess(二分匹配+强联通分量)
		
题意:婚配问题,但是题目并不要求输出最大匹配值,而是让我们输出,一个王子可以与哪些王妃婚配而不影响最大匹配值. 解决办法:先求一次最大匹配,如果有两个已经匹配的王妃,喜欢她们两个的有两个或者以上相同的 ...
 - Kosaraju算法---强联通分量
		
1.基础知识 所需结构:原图.反向图(若在原图中存在vi到vj有向边,在反向图中就变为vj到vi的有向边).标记数组(标记是否遍历过).一个栈(或记录顶点离开时间的数组). 算法描叙: :对 ...
 - [CF #236 (Div. 2) E] Strictly Positive Matrix(强联通分量)
		
题目:http://codeforces.com/contest/402/problem/E 题意:给你一个矩阵a,判断是否存在k,使得a^k这个矩阵全部元素都大于0 分析:把矩阵当作01矩阵,超过1 ...
 - 强联通 poj 2762
		
t个样例 (注意清零) n个点m条边 有向; 任意2点是否能从a->b或者b->a; Yes No #include<stdio.h> #include<algo ...
 - UVa 11324 & 强联通分量+DP
		
题意: 一张无向图,求点集使其中任意两点可到达. SOL: 强联通分量中的点要么不选要么全都选,然后缩点DAG+DP 记录一下思路,不想写了...代码满天飞.
 - BZOJ 1051 & 强联通分量
		
题意: 怎么说呢...这种题目有点概括不来....还是到原题面上看好了... SOL: 求出强联通分量然后根据分量重构图,如果只有一个点没有出边那么就输出这个点中点的数目. 对就是这样. 哦还有论边双 ...
 - 洛谷 P2661 信息传递 Label:并查集||强联通分量
		
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
 - POJ 1236-Network of Schools (图论-有向图强联通tarjan)
		
题目链接:http://poj.org/problem?id=1236 题目大意:N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输.问题 ...
 - POJ 2186-Popular Cows (图论-强联通分量Korasaju算法)
		
题目链接:http://poj.org/problem?id=2186 题目大意:有n头牛和m对关系, 每一对关系有两个数(a, b)代表a牛认为b牛是“受欢迎”的,且这种关系具有传递性, 如果a牛认 ...
 
随机推荐
- 数据库事务 ACID属性、数据库并发问题和四种隔离级别
			
数据库事务 ACID属性.数据库并发问题和四种隔离级别 数据库事务 数据库事务是一组逻辑操作单元,使数据从一种状态变换到另一种状态 一组逻辑操作单元:一个或多个DML操作 事务处理原则 保证所有事务都 ...
 - Shiro反序列化<=1.2.4 复现
			
Apache Shiro是一个Java安全框架,执行身份验证.授权.密码和会话管理. shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到reme ...
 - 助力面试之ConcurrentHashMap面试灵魂拷问,你能扛多久
			
目录 前言 ConcurrentHashMap 原理 JDK1.8 版本 ConcurrentHashMap 做了什么改进 为什么 key 和 value 不允许为 null ConcurrentHa ...
 - python的模块(module)和包(package)机制:import和from..import..
			
在python用import或者from...import来导入相应的模块. 模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中 ...
 - 几大BSD 区别
			
OpenBSD 侧重于安全,软件包较少,较陈旧,比如 KDE 才 3.5,为了安全舍弃了 sudo 和 linux 兼容层: FreeBSD 是开发者最多用户最多软件包最多的,有 ZFS 和 Linu ...
 - docker+compose+nginx+php
			
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 我用docker做什么? 快速搭建开发所需环境,测试实验新 ...
 - H5 简单实现打砖块游戏
			
实现效果如图所示: 1.布局 在html中,声明 div1 作为作为带有边框的父物体,一切行为都要在 div1 中进行.创建小球ball.左右可滑动的板子bat,以及存放要销毁的砖块的父物体 bri ...
 - apk签名、包名
			
//通过各手机管理软件,如如360.豌豆荚等查看 //使用命令行,可以查看到permission.packagename.title.versionCode等 aapt dump badging ~/ ...
 - Codeforces 1015E1 Stars Drawing (Easy Edition)
			
题面: 传送门 题目描述: 要求用十字星星来画题目给出的"星"图.如果不能用十字星星来画"星"图,输出-1:如果能,则输出要在图的哪个位置画相应大小的十字星图. ...
 - gtk编译之makefile的写法(之一)
			
在学习c语言GUI编程时想必大家都会遇见这样一个问题买就是每次编译都要敲`pkg-config --cflags --libs gtk+-2.0`这个烦恼吧 这是我们可以编写一个makefile文件这 ...