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. 谈一谈Vector类

    一.关于Vector类的注意事项 1.从 Java 2 平台 v1.2 开始,vector类改进为实现 List 接口,成为 Java Collections Framework 的成员:所以vect ...

  2. spring boot(十五)spring boot+thymeleaf+jpa增删改查示例

    快速上手 配置文件 pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 <dependency> <groupId>org.springframework.b ...

  3. 关于react16.4——转发refs和片段Fragment

    1.转发refs Ref 转发是一种自动将 ref 通过组件传递给子组件的技术. 一些组件倾向于以与常规 DOM button 和 input 类似的方式在整个应用程序中使用, 并且访问他们的 DOM ...

  4. java利用EasyPoi实现Excel导出功能

    easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言( ...

  5. python 常用代码

    获取标签名 h1 class 是h1usersoup.find(name="h1", attrs={"class":"h1user"});获 ...

  6. oracle数据库备份任务

    备份脚本如下: 1.0 expdp1.1导出某些schema #!/bin/bash ORACLE_BASE=/oracle/productexport ORACLE_BASEORACLE_HOME= ...

  7. Leetcode 980. 不同路径 III

    980. 不同路径 III  显示英文描述 我的提交返回竞赛   用户通过次数42 用户尝试次数43 通过次数46 提交次数60 题目难度Hard 在二维网格 grid 上,有 4 种类型的方格: 1 ...

  8. 迭代器与泛型for

    迭代器与closure function allwords() local line=io.read() return function() while line do local s,e=strin ...

  9. 2017-3-31/socket

    1. 讲讲你对套接字编程的理解,它的协议是如何的? socket通常称为"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通过套接字向网络发出请求或应答网络请求. 服 ...

  10. java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

    java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). at co ...