hdu3861 强连通分量缩点+二分图最最小路径覆盖
The King’s Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3471 Accepted Submission(s):
1231
There are N cities in the kingdom and there are M directional roads between the
cities. That means that if there is a road from u to v, you can only go from
city u to city v, but can’t go from city v to city u. In order to rule his
kingdom more effectively, the king want to divide his kingdom into several
states, and each city must belong to exactly one state. What’s
more, for each pair of city (u, v), if there is one way to go from u to v and go
from v to u, (u, v) have to belong to a same state. And the king must
insure that in each state we can ether go from u to v or go from v to u between
every pair of cities (u, v) without passing any city which belongs to other
state.
Now the king asks for your help, he wants to know the least number
of states he have to divide the kingdom into.
of test cases. And then followed T cases.
The first line for each case
contains two integers n, m(0 < n <= 5000,0 <= m <= 100000), the
number of cities and roads in the kingdom. The next m lines each contains two
integers u and v (1 <= u, v <= n), indicating that there is a road going
from city u to city v.
you should just output an integer which is the least number of states the king
have to divide into.
3 2
1 2
1 3
题意:一个有向图,让你按规则划分区域,要求划分的区域数最少。
规则如下:1、有边u到v以及有边v到u,则u,v必须划分到同一个区域内。2、一个区域内的两点至少要有一方能到达另一方。3、一个点只能划分到一个区域内。
解题思路:根据规则1可知必然要对强连通分量进行缩点,缩点后变成了一个弱连通图。根据规则2、3可知即是要求图的最小路径覆盖。
定义:
最小路径覆盖:在图中找一些路径(路径数最少),使之覆盖了图中所有的顶点,且每个顶点有且仅和一条路径有关联。
最小顶点覆盖:在图中找一些点(顶点数最少),使之覆盖了图中所有的边,每条边至少和一个顶点有关联。
二分图:最小顶点覆盖=最大匹配数。
最小路径覆盖=顶点数-最大匹配数。
二分图最最小路径覆盖:https://www.cnblogs.com/justPassBy/p/5369930.html
匈牙利算法:https://blog.csdn.net/dark_scope/article/details/8880547
代码:
#include<stdio.h>
#include<vector>
#include<stack>
#include<string.h>
using namespace std;
vector<int> s[5050];//
stack<int> st;
int vt[5050];
int cnt,ct;
int low[5050],dfn[5050];
int bl[5050],nd[5050];//例:如果是a-->b,则bl[b]=a;如果a点再经过tarjan算法后属于第i个集合,nd[a]=i;
struct
{
int x,y;
}mp[100050];
int min(int a,int b)
{
if(a<=b)
return a;
return b;
}
int tarjan(int a)//tarjan算法
{
int i,j;
low[a]=dfn[a]=cnt++;
vt[a]=1;
st.push(a);
for(i=0;i<s[a].size();i++)
{
int u=s[a][i];
if(!dfn[u])
{
tarjan(u);
low[a]=min(low[a],low[u]);
}
else if(vt[u])
low[a]=min(low[a],dfn[u]);
}
if(low[a]==dfn[a])
{
int x;
ct++;
do//为缩点作准备
{
x=st.top();
vt[x]=0;
nd[x]=ct;
st.pop();
}while(x!=a);
}
return 0;
}
int find(int a)//匈牙利算法
{
int i,j;
for(i=0;i<s[a].size();i++)
{
int u=s[a][i];
if(!vt[u])
{
vt[u]=1;
if(bl[u]==0||find(bl[u]))
{
bl[u]=a;
//printf("www%d %d\n",bl[u],u);
return 1;
}
}
}
return 0;
}
int main()
{
int n,m,t;
int i,j;
int a,b,sum;
scanf("%d",&t);
while(t--)
{
memset(dfn,0,sizeof(dfn));
memset(vt,0,sizeof(vt));
memset(bl,0,sizeof(bl));
ct=0;
cnt=1;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
s[i].clear();
for(i=1;i<=m;i++)
{
scanf("%d%d",&mp[i].x,&mp[i].y);
s[mp[i].x].push_back(mp[i].y);
}
for(i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
sum=0;
for(i=1;i<=n;i++)
s[i].clear();
for(i=1;i<=m;i++)//缩点并重新制图
{
int u,v;
u=nd[mp[i].x];
v=nd[mp[i].y];
if(u!=v)
s[u].push_back(v);
}
for(i=1;i<=ct;i++)
{
memset(vt,0,sizeof(vt));
if(find(i))
sum++;
}
printf("%d\n",ct-sum);
}
return 0;
}
例:
6 6
1 2
2 3
3 1
4 1
5 2
6 3
3
10 11
1 2
2 3
3 1
3 4
4 5
5 6
6 7
7 5
10 9
9 8
8 4
2
hdu3861 强连通分量缩点+二分图最最小路径覆盖的更多相关文章
- 【HDU3861 强连通分量缩点+二分图最小路径覆盖】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.有边u到v以及有 ...
- POJ 1422 Air Raid(二分图匹配最小路径覆盖)
POJ 1422 Air Raid 题目链接 题意:给定一个有向图,在这个图上的某些点上放伞兵,能够使伞兵能够走到图上全部的点.且每一个点仅仅被一个伞兵走一次.问至少放多少伞兵 思路:二分图的最小路径 ...
- POJ:3020-Antenna Placement(二分图的最小路径覆盖)
原题传送:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Descri ...
- POJ 3020:Antenna Placement(无向二分图的最小路径覆盖)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6334 Accepted: 3125 ...
- HDU 3861 The King’s Problem 最小路径覆盖(强连通分量缩点+二分图最大匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 最小路径覆盖的一篇博客:https://blog.csdn.net/qq_39627843/ar ...
- hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
The King’s Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- POJ 3020 Antenna Placement(无向二分图的最小路径覆盖)
( ̄▽ ̄)" //无向二分图的最小路径覆盖数=顶点总数-最大匹配数/2(最大匹配数=最小点覆盖数) //这里最大匹配数需要除以2,因为每两个相邻的*连一条边,即<u,v>和< ...
- UVA 1201 - Taxi Cab Scheme(二分图匹配+最小路径覆盖)
UVA 1201 - Taxi Cab Scheme 题目链接 题意:给定一些乘客.每一个乘客须要一个出租车,有一个起始时刻,起点,终点,行走路程为曼哈顿距离,每辆出租车必须在乘客一分钟之前到达.问最 ...
- POJ 1422 二分图(最小路径覆盖)
Air Raid Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7278 Accepted: 4318 Descript ...
随机推荐
- Agile敏捷开发Planning Poker简介
关注嘉为科技,获取运维新知 一.为什么不用“人天”? 传统的IT项目,尤其是软件开发项目,往往使用“人天”来作为工作量评估的量词.甚至是代表一种评估方式.在软件项目开发经典著作<人月神话&g ...
- gcc -02引起内存溢出'unsigned i'应修订为'volatile unsigned i'
2017-12-13 10:44:19gcc -02引起内存溢出'unsigned i'应修订为'volatile unsigned i' 1.3.100 driver/char/random.cst ...
- 并查集-解决区间和纠错问题 hdu-3038
题目:多次给出信息,告诉你[a,b]区间的和,求多少个错误信息(错误信息不考虑). 乍一看有点像线段树,但想想就发现这个并不能用线段树方便地解决.后来经提醒是并查集的一种经典题型. 把区间抽象为并查集 ...
- 一个不该写的bat
新建bat文件,放到D盘根目录 %0|%0 进入到C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Program ...
- 『TensorFlow』分布式训练_其二_单机多GPU并行&GPU模式设定
建议比对『MXNet』第七弹_多GPU并行程序设计 一.tensorflow GPU设置 GPU指定占用 gpu_options = tf.GPUOptions(per_process_gpu_mem ...
- Matlab-8:松弛迭代法(SOR)
function [x,n,flag]=sor(A,b,eps,M,max1) %sor函数为用松弛迭代法求解线性方程组 %A为线性方程组的系数矩阵 %b为线性方程组的常数向量 %eps为精度要求 % ...
- git回退代码到某次commit
回退命令: $ git reset --hard HEAD^ 回退到上个版本 $ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前 $ git res ...
- OCP-1Z0-051-V9.02-13题 单引号的使用
13. View the Exhibit and examine the structure of the PRODUCTS table. You need to generate a report ...
- 数据库恢复(database restore)之兵不血刃——半小时恢复客户数据库
昨天,一个客户打打来电话,说他们的数据库坏了,不能用了,需要我帮助恢复下,这马上要放假了,居然出了这事儿,自己也不太喜欢恢复数据库这类,尤其是他们的数据库是个win上的库,但心里很清楚,客户比咱着急, ...
- java 中多播、广播编程
在 IP 协议层,有多播.广播的概念.IP 地址分为网络地址和主机地址,主机地址全部为1,就是广播地址.多播使用 D 类地址,从 224.0.0.0 到 239.255.255.255.IP 多播需要 ...