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 ...
随机推荐
- 小程序for循环嵌套
<view class='nocontnt' wx:if="{{listLength == 0 }}"> 暂无相关评论 </view> <view c ...
- Vue-router中的导航钩子
vue-router中的导航钩子,主要用来作用是拦截导航,让他完成跳转或取消.(路由守卫) 原文指路:https://blog.csdn.net/weixin_41399785/article/det ...
- 牛客练习赛41 B-666RPG
题目链接:https://ac.nowcoder.com/acm/contest/373/B 题意:有n个回合,每个回合给1个数,每个回合你有两种选择 1.加上第i个数 2.将当前数乘-1 想知道有多 ...
- .NET 高效开发之不可错过的实用工具(第一的当然是ReSharper插件)
工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为 ASP.NET 开发者介绍一些高效实用的工具,包括 SQL 管理,VS插件,内存管理,诊断工具等,涉及开发过程的各个环节 ...
- logstash快速入门
转自 http://blog.csdn.net/wp500/article/details/41040213 原文地址:http://logstash.net/docs/1.4.2/tutorials ...
- C# 语法特性 - 匿名方法(C#2.0)
概述 匿名方法的本质其实就是委托. 编译后会生成委托对象,生成方法,然后把方法装入委托对象,最后赋值给声明的委托变量. (匿名方法可以省略参数:编译的时候会自动为这个方法按照委托签名的参数添加参数) ...
- noip2013转圈游戏
题目描述 n个小伙伴(编号从 0到 n−1)围坐一圈玩游戏.按照顺时针方向给 n个位置编号,从0 到 n−1.最初,第 0号小伙伴在第 0号位置,第 1号小伙伴在第 1 号位置,……,依此类推. 游戏 ...
- import 和 from … import 模块的变量、方法引用差异
import 和 from … import 模块的变量.方法引用差异 还是上面例子中的模块 support.py: def print_func( par ): print "Hello ...
- coursera国际法笔记 持续更新
LECTURE ONE International crime court(ICC) came into being after the Second World War. The Nuremberg ...
- POJ 2243 Knight Moves(BFS)
POJ 2243 Knight Moves A friend of you is doing research on the Traveling Knight Problem (TKP) where ...