HDU3861The King’s Problem
kosaraju缩点+最小路径覆盖
为什么是最小路径覆盖呢,我们假设有一个如下DAG图

目前我们1出发到了3处,对于3的儿子4、5、6,肯定是不能彼此到达的。所以最好的情况3只能延伸一个方向,比如4,解法
如代码。则有1—3—4,2,5,6,答案是4条。
#include<cstdio>
#include<cstring>
#include<stack>
#include<cstdlib>
#include<queue>
#include<memory.h>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
const int maxn=;
vector<int>G[maxn];
vector<int>G2[maxn];
vector<int>S;
vector<int>Map[maxn];
int scc[maxn],vis[maxn],n,m,scc_cnt,ans;
int link[maxn];
void _update(){
for(int i=;i<=n;i++) G[i].clear();
for(int i=;i<=n;i++) G2[i].clear();
memset(link,,sizeof(link));
memset(vis,,sizeof(vis));
memset(scc,,sizeof(scc));
S.clear();
ans=scc_cnt=;
}
void _dfs1(int v){
if(vis[v]) return ;
vis[v]=;
int L=G[v].size();
for(int i=;i<L;i++)_dfs1(G[v][i]);
S.push_back(v);
return ;
}
void _dfs2(int v){
if(scc[v]) return ;
scc[v]=scc_cnt;
int L=G2[v].size();
for(int i=;i<L;i++) _dfs2(G2[v][i]);
}
void _kosaraju()
{
for(int i=;i<=n;i++)_dfs1(i);
for(int i=n-;i>=;i--) {
if(!scc[S[i]]) {
scc_cnt++;
Map[scc_cnt].clear();
_dfs2(S[i]);
}
}
for(int i=;i<=n;i++)
{
int L=G[i].size();
for(int j=;j<L;j++){
if(scc[i]!=scc[G[i][j]]){
Map[scc[i]].push_back(scc[G[i][j]]);
}
}
}
}
bool _find(int v){
int L=Map[v].size();
for(int i=;i<L;i++)
{
if(!vis[Map[v][i]]){
vis[Map[v][i]]=;
if(!link[Map[v][i]]||_find(link[Map[v][i]])){
link[Map[v][i]]=v;
return true;
}
}
}
return false;
}
int main()
{
int T,i,j,u,v;
scanf("%d",&T);
while(T--){
_update();
scanf("%d%d",&n,&m);
for(i=;i<=m;i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
G2[v].push_back(u);
}
_kosaraju();
for(i=;i<=scc_cnt;i++){
memset(vis,,sizeof(vis));
if(_find(i)) {
ans++;
}
}
printf("%d\n",scc_cnt-ans);//以Map图位对象,不是n
}
return ;
}
HDU3861The King’s Problem的更多相关文章
- hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
The King’s Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 3861 The King’s Problem trajan缩点+二分图匹配
The King’s Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 3861.The King’s Problem 强联通分量+最小路径覆盖
The King’s Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 3861 The King’s Problem(tarjan缩点+最小路径覆盖:sig-最大二分匹配数,经典题)
The King’s Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 3861 The King’s Problem(强连通+二分图最小路径覆盖)
HDU 3861 The King's Problem 题目链接 题意:给定一个有向图,求最少划分成几个部分满足以下条件 互相可达的点必须分到一个集合 一个对点(u, v)必须至少有u可达v或者v可达 ...
- hdu——3861 The King’s Problem
The King’s Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 3861--The King’s Problem【scc缩点构图 && 二分匹配求最小路径覆盖】
The King's Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 3861 The King’s Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- HDU——T The King’s Problem
http://acm.hdu.edu.cn/showproblem.php?pid=3861 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
随机推荐
- 3 、操作元素 (属性 CSS 和 文档处理)
3 操作元素-属性 CSS 和 文档处理 3.1 属性操作 $("p").text() $("p").html() $(":check ...
- 528. Random Pick with Weight
1. 问题 给定一个权重数组w,w[i]表示下标i的权重,根据权重从数组中随机抽取下标. 2. 思路 这道题相当于 497. Random Point in Non-overlapping Recta ...
- 一、怎样使用eclipse查看JDK源码
前言: JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库.阅读一些系统的源码会帮助你理解一些基本的原理. 一.创建一个工程 在eclipse中创建一个jav ...
- 20145311实验五"Java网络编程及安全"
20145311实验五 "Java网络编程及安全" 程序设计过程 实验内容 ·掌握Socket程序的编写:·掌握密码技术的使用:·设计安全传输系统 ·利用加解密代码包,编译运行代码 ...
- labview之连接MySQL数据库
Labview之连接MySQL数据库 由于项目需要,在Labview开发中,需要使用MySQL数据库.这里介绍两种连接MySQL数据库的方式. 分别为使用Labsql工具包和Database Conn ...
- POJ 1062 昂贵的聘礼(最短路)题解
题意:中文题意不解释... 思路:交换物品使得费用最小,很明显的最短路,边的权值就是优惠的价格,可以直接用Dijkstra解决.但是题目中要求最短路路径中任意两个等级不能超过m,我们不能在连最短路的时 ...
- [微信开发] - weixin4j获取网页授权后的code进而获取用户信息
weixin4j封装好的SnsComponent组件中的方法可以执行该步骤 WeixinUserInfoController : package com.baigehuidi.demo.control ...
- class []的用法
span[class='test'] =>匹配所有带有class类名test的span标签 span[class *='test'] =>匹配所有包含了test字符串的class类 ...
- C++总结:C++中的const和constexpr
C++中的const可用于修饰变量.函数,且在不同的地方有着不同的含义,现总结如下. const的语义 C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象 ...
- VC6_预编译头
1.去掉 使用预编译头"stdafx.h" VC6 --> Project --> Settings.. --> C/C++选项卡 --> "Ca ...