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

Problem Description
In the Kingdom of Silence, the king has a new problem.
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.
 
Input
The first line contains a single integer T, the number
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.

 
Output
The output should contain T lines. For each test case
you should just output an integer which is the least number of states the king
have to divide into.
 
Sample Input
1
3 2
1 2
1 3
 
Sample Output
2
 
Source
题意转载自http://www.cnblogs.com/kane0526/archive/2013/07/21/3203992.html

题意:一个有向图,让你按规则划分区域,要求划分的区域数最少。

规则如下: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 强连通分量缩点+二分图最最小路径覆盖的更多相关文章

  1. 【HDU3861 强连通分量缩点+二分图最小路径覆盖】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.有边u到v以及有 ...

  2. POJ 1422 Air Raid(二分图匹配最小路径覆盖)

    POJ 1422 Air Raid 题目链接 题意:给定一个有向图,在这个图上的某些点上放伞兵,能够使伞兵能够走到图上全部的点.且每一个点仅仅被一个伞兵走一次.问至少放多少伞兵 思路:二分图的最小路径 ...

  3. POJ:3020-Antenna Placement(二分图的最小路径覆盖)

    原题传送:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Descri ...

  4. POJ 3020:Antenna Placement(无向二分图的最小路径覆盖)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6334   Accepted: 3125 ...

  5. HDU 3861 The King’s Problem 最小路径覆盖(强连通分量缩点+二分图最大匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 最小路径覆盖的一篇博客:https://blog.csdn.net/qq_39627843/ar ...

  6. hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】

    The King’s Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. POJ 3020 Antenna Placement(无向二分图的最小路径覆盖)

    ( ̄▽ ̄)" //无向二分图的最小路径覆盖数=顶点总数-最大匹配数/2(最大匹配数=最小点覆盖数) //这里最大匹配数需要除以2,因为每两个相邻的*连一条边,即<u,v>和< ...

  8. UVA 1201 - Taxi Cab Scheme(二分图匹配+最小路径覆盖)

    UVA 1201 - Taxi Cab Scheme 题目链接 题意:给定一些乘客.每一个乘客须要一个出租车,有一个起始时刻,起点,终点,行走路程为曼哈顿距离,每辆出租车必须在乘客一分钟之前到达.问最 ...

  9. POJ 1422 二分图(最小路径覆盖)

    Air Raid Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7278   Accepted: 4318 Descript ...

随机推荐

  1. Mycat入门核心概念

      Mycat中的核心概念     Mycat中的核心概念 1.数据库中间件    Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有 存储引擎,所以并 ...

  2. linux进程管理之信号控制

    使用信号控制进程 ====================================================================================kill,ki ...

  3. sgu 191 Exhibition

    题意:开始只有某一展台(设为A),有2种操作.1.A展台上放B产品(或者B展台放A产品).2.A展台左边1位放B展台,左边2位放A产品.给出最终产品的排列,问能否实现. 考虑最后一个用2操作的展台,因 ...

  4. PHP多种序列化/反序列化的方法(serialize和unserialize函数)

    serialize和unserialize函数 这两个是序列化和反序列化PHP中数据的常用函数. <?php $a = array('a' => 'Apple' ,'b' => 'b ...

  5. Linux中磁盘分区——理论篇

    Linux中磁盘分区——理论篇 现在主流的分区的方式有两种——MBR分区和GPT分区,本文将着重介绍MBR分区底层原理,及用相关命令验证相关原理 Linux中磁盘分区理论篇 为什么要对磁盘进行分区 M ...

  6. Jupyter notebook 转 pdf [完整转换]

  7. Spring的几种注入bean的方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式).   使用属性的se ...

  8. hdu-3671-tarjin/割点方案

    http://acm.hdu.edu.cn/showproblem.php?pid=3671 给出一幅无向图,询问有多少种移除点对的方案使得剩下的连通分量个数大于1. 和上一题差不多的思路直接做n次t ...

  9. CF-503div2-A/B/C

    A. New Building for SIS time limit per test 1 second memory limit per test 256 megabytes input stand ...

  10. SQL 经典回顾:JOIN 表连接操作不完全指南

    ​   2017-02-23 小峰 ITPUB 点击上方“蓝字”可以关注我们哦  |转载自:码农网 |原文链接:www.codeceo.com/article/sql-join-guide.html ...