Poj_1904

背景:本来是在做Voj的连通分量,做到了E( hdu_4685 ),想到了二分图,但是笔者只会最大匹配,但题目要求要输出所有的最大匹配情况,想了好久都没想出来怎么做,因为如果我已知一个最大匹配,那么就可以将公主连反向边指向王子,然后跑tarjan,将每个强连通分量的王子配公主输出即可,但是这题没有给出最大匹配,这个还不是最坑的,因为可以跑一次最大匹配,最坑的是n个王子,但是有m个公主,看到这个真的想打人,这个就真的难受了,因为如果有人单身怎么办??所以就去百度了,然后题解几乎全部提及Poj1904,于是乎笔者就去找到了这题,这题就是笔者想的那个给出匹配的版本,所以很快A掉了,但是!!re了4发,因为王子公主就2000,笔者边集数组没有多想,只开了两倍,到最后一直开到10w都还是re,最后百度一看,20W起加(貌似有个204000)过的,最后数组开到26w就过去了,不得不说这题的这个坑点真的是,很难过了。

题目大意:给出n个王子和他们仰慕的公主,接下来给出每个公主已经匹配的王子(即给出一组最大匹配),输出每个王子最多能和哪些公主匹配。

题解:对于王子仰慕的公主建边,而题目提供的最大匹配,用于建反向边,然后tarjan缩点,同一个分量里面的王子公主随意输出(笔者排了个序方便差错,忘了题目是否有要求)。

PS:今天应该可以把hdu_4685写出来,题解说是要虚拟出公主和王子,容笔者仔细想想,感觉想通了实现应该很快,毕竟这些点都挺熟悉的。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std; const int N = 5005;
const int M = 260000;
const int INF = 0x3f3f3f3f; struct Edge
{
int u, v, nxt;
};
Edge edge[M];
int ecnt, head[N];
int top, sum, dep;
bool vis[N];
int sta[N], low[N], dfn[N], col[N];
int ans[N]; void _add( int a, int b )
{
edge[ecnt].u = a;
edge[ecnt].v = b;
edge[ecnt].nxt = head[a];
head[a] = ecnt ++;
} void tarjan( int u )
{
sta[++top] = u;
low[u] = dfn[u] = ++dep;
vis[u] = 1; for ( int i = head[u]; i+1; i = edge[i].nxt )
{
int v = edge[i].v;
if ( !dfn[v] )
{
tarjan(v);
low[u] = min( low[u], low[v] );
}
else if ( vis[v] )
low[u] = min( low[u], low[v] );
} if ( low[u] == dfn[u] )
{
vis[u] = 0;
col[u] = ++sum;
while ( sta[top] != u )
{
vis[sta[top]] = 0;
col[sta[top--]] = sum;
}
top --;
}
} int main()
{
int n;
scanf("%d", &n);
memset(head,-1,sizeof(head));
for ( int i = 1; i <= n; i ++ )
{
int cn, pricn;
scanf("%d", &cn);
while ( cn -- )
{
scanf("%d", &pricn);
_add( i, pricn + n );
}
} for ( int i = 1; i <= n; i ++ )
{
int pric;
scanf("%d", &pric);
_add( pric + n, i );
} for ( int i = 1; i <= n; i ++ )
if ( !dfn[i] )
tarjan(i); for ( int i = 1; i <= n; i ++ )
{
int cnt = 0;
for ( int j = head[i]; j+1; j = edge[j].nxt )
{
int v = edge[j].v;
if ( col[i] == col[v] )
ans[cnt++] = v - n;
} sort(ans,ans+cnt);
printf("%d", cnt);
for ( int i = 0; i < cnt; i ++ )
printf(" %d", ans[i]);
printf("\n");
}
return 0;
}

Graph_Master(连通分量_Poj_1904)的更多相关文章

  1. Graph_Master(连通分量_G_Trajan+Thought)

    Graph_Master~(连通分量) 题目大意:给出m条边(隧道,无向),每条边连接两个点(矿场).要在这些矿场中建设救援出口,防止矿场坍塌造成人员伤亡,问最少需要几个救援出口,以及对应方案数.(假 ...

  2. Graph_Master(连通分量_H_Trajan+拓扑序dp)

    Graph_Master_连通分量_H 题目描述: 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条 ...

  3. Graph_Master(连通分量_D_Trajan缩点+dfs)

    hdu_2242 题目大意:求将一张无向图(n个点,m条边)移除一条边分为不连通两部分,使得两部分的点权和最接近,若无法分为两部分,则输出impossible. 题解:拿到题面还算清晰,就是先tarj ...

  4. Graph_Master(连通分量_A_双连通分量+桥)

    hdu 5409 题目大意:给出一张简单图,求对应输入的m条边,第i-th条边被删除后,哪两个点不连通(u,v,u<v),若有多解,使得u尽量大的同时v尽量小. 解题过程:拿到题面的第一反应缩点 ...

  5. Graph_Master(连通分量_E_Hungry+Tarjan)

    hdu_4685 终于来写了这题的解题报告,没有在昨天A出来有点遗憾,不得不说数组开大开小真的是阻碍人类进步的一大天坑. 题目大意:给出n个王子,m个公主,只要王子喜欢,公主就得嫁(这个王子当得好霸道 ...

  6. Graph_Master(连通分量_C_Trajan缩点+最小路径覆盖)

    hdu_3861 题目大意:给定一张有向图,若<u,v>可达(u可以走到v,或者 v可以走到u),则<u,v>需被划分在统一城邦,问最小划分城邦数. 题解:比较裸的题,可以看出 ...

  7. Graph_Master(连通分量_B_Trajan+完全图)

    hdu_4635 题目大意:给出一张DAG(n个点,m条边),求出能加的最大边数,使得该图无重边,无自环,非强连通. 题解:这题题面很好理解,也没有什么很难的点,主要是如何求出最大边数需要动点脑筋.首 ...

  8. POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 12439   Acce ...

  9. 【Codefoces487E/UOJ#30】Tourists Tarjan 点双连通分量 + 树链剖分

    E. Tourists time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard inpu ...

随机推荐

  1. Whether to hide the cookie from JavaScript

    w禁用js访问特定cookie. https://codeigniter.com/userguide3/helpers/cookie_helper.html $this->load->he ...

  2. 网络编程 - socket通信/粘包/文件传输/udp - 总结

    socket通信 1.简单的套接字通信 import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bin ...

  3. Xshell 连接虚拟机特别慢 解决方案

    由于各种原因,xshell连接虚拟机的rhel或者CentOS都几乎是龟速...... 今天专门查了一下解决方案: 原来是ssh的服务端在连接时会自动检测dns环境是否一致导致的,修改为不检测即可,操 ...

  4. 004-Shell 基本运算符、算术运算符、关系运算符、布尔运算符、辑运算符、字符串运算符、文件测试运算符

    一.概述 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 二.算术运算符 原生bash不支持简单的数学运算,但是可以通过其他命 ...

  5. 查看Oracle latch _spin_count默认值

    查看Oracle latch  _spin_count默认值 SELECT X.KSPPINM NAME, Y.KSPFTCTXVL VALUE, Y.KSPFTCTXDF ISDEFAULT FRO ...

  6. C++学习笔记--名称空间

    名称空间是为了更好的控制名称的作用域,以管理不同的类库,避免发生冲突. 1.创建名称空间 如下,使用namespace关键字创建了pers和debts两个名称空间. #ifndef NAMESP_H_ ...

  7. What does Quick Sort look like in Python?

    Let's talk about something funny at first. Have you ever implemented the Quick Sort algorithm all by ...

  8. mysql数据库从删库到跑路之mysql完整性约束

    一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...

  9. Linux优雅退出问题

    问题:Springboot框架开发的项目中会内嵌tomcat容器,在杀死进程的时候tomcat为被正常杀死,导致端口未被释放,第二次启动的时候报端口冲突. 先讲一个基本概念:如何在shell中终止一个 ...

  10. Andriod实现推送的解决方案(转)

    Andriod上实现消息推送的一般解决策略 第一种解决方案:C2DM云端推送功能 在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,该服务 ...