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 ...
随机推荐
- org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1428942566812653608
一.异常信息 org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet reque ...
- yarn基础解释
https://yarnpkg.com/zh-Hans/docs Yarn 对你的代码来说是一个包管理器, 你可以通过它使用全世界开发者的代码,或者分享自己的代码. 代码通过包(package)(或者 ...
- caffe 动态库 Release X64
Release X64平台 createdll.h#ifndef CREARDLL_H_#define CREARDLL_H_ extern "C" _declspec(dllex ...
- 4.1.4 Nim
Problem description: 有n堆石子,每堆各有ai颗石子.A和B轮流从非空的石子堆中取走至少一颗石子.A先取,取光所有石子的一方获胜.当双方都采用最佳策略时,谁会获胜? 1<=n ...
- SP10707 COT2 - Count on a tree II (树上莫队)
大概学了下树上莫队, 其实就是在欧拉序上跑莫队, 特判lca即可. #include <iostream> #include <algorithm> #include < ...
- SQL SERVER pivot(行转列),unpivot(列转行)
[pivot]行转列:多行变一列 假设学生成绩表Score1 Name Subject Score 小张 语文 88 小花 数学 89 小张 数学 90 Name 语文 数学 小花 null 89 小 ...
- 『cs231n』卷积神经网络工程实践技巧_下
概述 计算加速 方法一: 由于计算机计算矩阵乘法速度非常快,所以这是一个虽然提高内存消耗但是计算速度显著上升的方法,把feature map中的感受野(包含重叠的部分,所以会加大内存消耗)和卷积核全部 ...
- 托管DLL和非托管DLL的区别
首先解释一下,托管DLL和非托管DLL的区别.狭义解释讲,托管DLL就在Dotnet环境生成的DLL文件.非托管DLL不是在Dotnet环 境生成的DLL文件. 托管DLL文件,可以在Dotnet环境 ...
- Hadoop---目录结构介绍
Hadoop---目录结构介绍 1.Hadoop目录结构 1.一级目录介绍 2.etc详解: 3sbin 4.bin 5.share 6.一个数独测试 2.hadoop的历史 3. Ha ...
- 建一个maven项目
建一个普通的maven项目(eclipse) 需要的jar和文件: eclipse :jdk1.8.0_144 maven:apache-maven-3.5.3 进入(下载):http:// ...