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 ...
随机推荐
- 爬虫学习之-操作mysql
在操作数据库的时候,python2中一般使用mysqldb,但在python3中已经不在支持mysqldb了,我们可以用pymysql和mysql.connector.本文的所有操作都是在python ...
- ZOJ3067_Nim
题目的意思就不说了,典型的取石子的博弈问题. 题目的前半部分就是赤果果的SG函数值异或就可以了,其中Sg函数值就是石子数本身. 但是接下来有个小变换,就是要你输出先手必胜有多少种不同的取法. 首先要想 ...
- mysql数据库的存储过程
一. 什么是存储过程: 存储过程是一组可编程的函数,是为了完成特定功能的SQL语句集,经过第一次编译后再次调用不需要再次编译,创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调 ...
- 【BZOJ5418】【NOI2018】屠龙勇士(数论,exgcd)
[NOI2018]屠龙勇士(数论,exgcd) 题面 洛谷 题解 考场上半个小时就会做了,一个小时就写完了.. 然后发现没过样例,结果大力调发现中间值爆\(longlong\)了,然后就没管了.. 然 ...
- NOIP2017 逛公园 题解报告 【最短路 + 拓扑序 + dp】
题目描述 策策同学特别喜欢逛公园.公园可以看成一张NNN个点MMM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,NNN号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花 ...
- 洛谷P1602 Sramoc问题 题解报告【同余+bfs】
题目描述 话说员工们整理好了筷子之后,就准备将快餐送出了,但是一看订单,都傻眼了:订单上没有留电话号码,只写了一个sramoc(k,m)函数,这什么东西?什么意思?于是餐厅找来了资深顾问团的成员,YQ ...
- bzoj3173: [Tjoi2013]最长上升子序列(fhqtreap)
这题用fhqtreap可以在线. fhqtreap上维护以i结尾的最长上升子序列,数字按从小到大加入, 因为前面的数与新加入的数无关, 后面的数比新加入的数小, 所以新加入的数对原序列其他数的值没有影 ...
- 【agc004C】AND Grid
Portal --> agc004C Description 给你一个\(n*m\)的网格图\(A\),有一些格子是'#',现在要构造出两个新的网格图\(B\)和\(C\)满足: 1.如果\(A ...
- webpack 4.x使用总结
1.webpack 全局安装 npm install -g webpack 2.创建项目 比如文件夹是webpackdemo cd到webpackdemo文件夹下,执行: npm init 和 npm ...
- vue添加属性绑定
html <div id="app-2"> <span v-bind:title="message"> 鼠标悬停几秒钟查看此处动态绑定的 ...