King's Quest POJ - 1904 匈牙利算法的思想+tarjan缩点+染色
题目链接:https://cn.vjudge.net/problem/POJ-1904
自己一开始的想法,打算用匈牙利算法实现,找二分图的最大匹配。但是打了打发现,不太好实现。原因如下:匈牙利算法是不停的找增广路。如果这个题用匈牙利算法实现的时候,就是这个地方:
bool Find(int t)
{
for(int i=; i<=m; i++)
{
if(line[t][i]&&Exit[i]==)
{
Exit[i]=;
if(net[i]==||Find(net[i]))
{
net[i]=t;
return true;
}
}
}
}
,这个是找到合法的就返回,无法把所有的情况都找到,所以这个方法不行。
然后再去想tarjan算法,找缩点,也就是图上的两点都能都到达,如果是王子向喜欢的公主连线的话,连一条单向边,如果是公主喜欢的王子的话,然后再从公主连向王子一条单向边,这样,就能够在最大匹配的图上实现一个连通图的建立.
但是注意这个题有个坑点,在构成连通图的时候,有的王子不喜欢某个公主,但是在图上也有可能通过别的点联通起来,这个时候就需要特判一下了。
AC代码:
#include<iostream>
#include<stack>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stdio.h>
#include<map>
using namespace std;
# define inf 0x3f3f3f3f
# define ll long long
const int N = + ;
const int M = + ;
struct node
{
int to;
int nex;
} edge[M];
int head[M],low[N],dfn[N],istack[N];
int num,ind,col,n,m;
stack<int>q;
vector<int>wakaka[N];
vector<int>w1;
vector<int>ans[N];
int Map[][];
void init()
{
while(!q.empty())q.pop();
memset(head,-,sizeof(head));
num=,ind=,col=;
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
memset(istack,,sizeof(istack));
}
void addedge(int fr,int to)
{
edge[num].to=to;
edge[num].nex=head[fr];
head[fr]=num++;
}
void tarjan(int u,int root)
{
q.push(u);
low[u]=dfn[u]=++ind;
for(int i=head[u]; i!=-; i=edge[i].nex)
{
int v=edge[i].to;
if(dfn[v]==)
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
}
else if(istack[v]==)
{
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u])
{
int t;
col++;
do
{
t=q.top();
q.pop();
istack[t]=col;
wakaka[col].push_back(t);
}
while(t!=u);
}
}
int main()
{
init();
scanf("%d",&n);
int t;
for(int i=; i<=n; i++)
{
scanf("%d",&m);
for(int j=; j<=m; j++)
{
scanf("%d",&t);
addedge(i,t+n);
Map[i][t]=;
}
}
for(int i=; i<=n; i++)
{
scanf("%d",&t);
addedge(t+n,i);
// Map[t][i]=1;
}
for(int i=; i<=n; i++)
{
if(dfn[i]==)
{
tarjan(i,);
}
}
for(int i=; i<=col; i++)
{
sort(wakaka[i].begin(),wakaka[i].end());
int len=wakaka[i].size();
for(int j=; j<len; j++)
{
int u=wakaka[i][j];
if(u<=n)w1.push_back(u);
else
{
int len2=w1.size();
for(int k=; k<len2; k++)
{
if(Map[w1[k]][u-n])//判断是不是有相互喜欢的关系
ans[w1[k]].push_back(u-n);
}
}
}
w1.clear();
}
for(int i=; i<=n; i++)
{
sort(ans[i].begin(),ans[i].end());
int len=ans[i].size();
printf("%d",len);
for(int j=; j<len; j++)
{
printf(" %d",ans[i][j]);
}
printf("\n");
}
return ;
}
King's Quest POJ - 1904 匈牙利算法的思想+tarjan缩点+染色的更多相关文章
- King's Quest - poj 1904(强连通分量+外挂输入输出)
题意:国王有N个儿子,每个儿子都有很多喜欢的姑娘,官员为每个王子都找了一个姑娘让他们结婚,不过国王不满意,他想知道他的每个儿子都可以和那个姑娘结婚(前提他的儿子必须喜欢那个姑娘) 分析:因为最下面一行 ...
- King's Quest POJ - 1904(强连通分量)
建图:王子u喜欢女孩v,则u到v连一条边.对于给出的初始完美匹配,王子u与女孩v匹配,则v到u连一条边.然后求SCC. 显然对于同一个SCC中王子数目和女孩数目是相等的,并且从某个王子出发能够到达所有 ...
- POJ 1236 Network of Schools(Tarjan缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16806 Accepted: 66 ...
- POJ 3041 匈牙利算法模板题
一开始预习是百度的算法 然后学习了一下 然后找到了学长的ppt 又学习了一下.. 发现..居然不一样... 找了模板题试了试..百度的不好用 反正就是wa了..果然还是应当跟着学长混.. 图两边的点分 ...
- Asteroids POJ - 3041 匈牙利算法+最小点覆盖König定理
题意: 给出一个N*N的地图N 地图里面有K个障碍 你每次可以选择一条直线 消除这条直线上的所有障碍 (直线只能和列和行平行) 问最少要消除几次 题解: 如果(x,y)上有一个障碍 则把 ...
- POJ 2446 匈牙利算法
题意: 思路: 二分图匹配... // by SiriusRen #include <cmath> #include <cstdio> #include <cstring ...
- POJ 2239 匈牙利算法
思路:最大匹配 也是很裸的一道题-. // by SiriusRen #include <cstdio> #include <cstring> #include <alg ...
- POJ 2536 匈牙利算法
思路:最大匹配 (很裸) // by SiriusRen #include <cmath> #include <cstdio> #include <cstring> ...
- poj 1236 Network of Schools(tarjan+缩点)
Network of Schools Description A number of schools are connected to a computer network. Agreements h ...
随机推荐
- java和mysql的length()区别及char_length()
一. mysql里面的有length和char_length两个长度函数,区别在于: length: 一个汉字是算三个字符,一个数字或字母算一个字符. char_length: 不管汉字还是数字或者是 ...
- 第84天:jQuery动态创建表格
jQuery动态创建表格 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- HDU2460-Network
题目 给一个\(n\)个点\(m\)条边的无向连通图,\(Q\)次往图中加边,每次加边后问图中的桥有多少个.(加边后边留着). \(n\le 10^5,m\le 2\times 10^5,Q\le 1 ...
- 【bzoj1502】[NOI2005]月下柠檬树 自适应Simpson积分
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理.李哲是一个喜爱思考的孩子,当他看到在月 ...
- 【数据库_Postgresql】sql查询结果添加序号列
ROW_NUMBER () OVER (ORDER BY A .ordernumber ASC) AS 序号
- 【JavaScript】table显示问题
table有时显示出问题,解决办法如下: 添加<thead></thead>和<tbody></tbody>在table的外面添加<div> ...
- P3629 [APIO2010]巡逻
题目描述 在一个地区中有 n 个村庄,编号为 1, 2, ..., n.有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通过这些道路到达其 他任一个村庄.每条道 ...
- LiveCD及Casper调研
1.LiveCD原理 LiveCD本质上是ISO 9660/El Torito格式的CD-ROM. 下面对LiveCD涉及的各种技术做了简单的调研. 1.1. CD-ROM CD-ROM是一种光盘存储 ...
- 洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告
P4390 [BOI2007]Mokia 摩基亚 题目描述 摩尔瓦多的移动电话公司摩基亚(\(Mokia\))设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户 ...
- Rearrangement inequality
摘抄自: https://en.wikipedia.org/wiki/Rearrangement_inequality#Proof In mathematics, the rearrangement ...