HDOJ1151有向图最小路径覆盖

//有向图最小路径覆盖:从某一点出发沿着有向路径,不走回路,能将所有的结点遍历。

#include<iostream>
#include<cstdio>
#include<vector>
#include<set>
using namespace std;
const int MAX_N=125;
int match[MAX_N];
bool vis[MAX_N];
set<int> insert;
vector<int> e[MAX_N];
int n,k;
void Init()
{
    scanf("%d %d",&n,&k);
    memset(match, -1, sizeof(match));
    insert.clear();
    for(int i=0; i<MAX_N; i++)
    {
        e[i].clear();
    }
    int a, b;
    for(int i=0; i<k; i++)
    {
        scanf("%d %d", &a, &b);
        insert.insert(a);
        e[a].push_back(b);
    }
}

bool Dfs(int x)
{
    for(int i=0; i<e[x].size(); i++)
    {
        int u=e[x][i];
        if(!vis[u])
        {
            vis[u]=1;
            if(match[u]==-1||Dfs(match[u]))
            {
                match[u]=x;
                return true;
            }
        }
    }
    return false;
}

int Bi_matching()
{
    int ans=0;
    set<int>::iterator it;
    for(it=insert.begin(); it!=insert.end(); it++)
    {
        int i=(*it);
        memset(vis, false, sizeof(vis));
        if(Dfs(i))
            ans++;
    }
    return ans;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        Init();
        printf("%d\n",n-Bi_matching());//最小路径覆盖=结点数-最小点集覆盖
    }
    return 0;
}
时间: 2024-08-24 08:06:19

HDOJ1151有向图最小路径覆盖的相关文章

HDU1151 Air Raid(有向图最小路径覆盖)

题意: N个点M条边的有向图 意思就是问最小覆盖 思路: 有向图建单向边,然后匈牙利求最大匹配数 用N-最大匹配就可以了 /* *********************************************** Author :devil Created Time :2016/5/17 11:55:14 ************************************************ */ #include <cstdio> #include <cstring

HDU3861-The King’s Problem(有向图强连通缩点+最小路径覆盖)

题目链接 题意:题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下: 1.有边u到v以及有边v到u,则u,v必须划分到同一个区域内. 2.一个区域内的两点至少要有一方能到达另一方. 3.一个点只能划分到一个区域内. 思路:根据规则1可知必然要对强连通分量进行缩点,缩点后变成了一个弱连通图.根据规则2.3可知即是要求图的最小路径覆盖. 代码: #include <iostream> #include <cstdio> #include <cstring&

匈牙利算法 hdu 1151有向图的最小路径覆盖=顶点数-最大匹配数

Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3617    Accepted Submission(s): 2377 Problem Description Consider a town where all the streets are one-way and each street leads from on

poj 2594Treasure Exploration(有向图路径可相交的最小路径覆盖)

1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #define N 505 6 using namespace std; 7 8 int g[N][N]; 9 int n, m; 10 int vis[N], linker[N]; 11 bool dfs(int u){ 12 for(int i=1; i<=n; ++i) 13 if

[HDOJ1151]Air Raid(最小路径覆盖,匈牙利算法)

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1151 题意:就是求最小路径覆盖,根据定义出的题. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃ 12 ┛┗┛┗┛┃ 13 ┓┏┓┏┓┃ 14 ┃┃┃┃┃┃ 15 ┻┻┻┻┻┻ 16 */

hiho 第118周 网络流四&#183;最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1

hdu3861 强连通+最小路径覆盖

题意:有 n 个点,m 条边的有向图,需要将这些点分成多个块,要求:如果两点之间有路径能够互相到达,那么这两个点必须分在同一块:在同一块内的任意两点相互之间至少要有一条路径到达,即 u 到达 v 或 v 到达 u:每个点都只能存在于单独一个块内.问最少需要划分多少块. 首先,对于如果两点之间能够相互到达则必须在同一块,其实也就是在同一个强连通分量中的点必须在同一块中,所以首先就是强连通缩点.然后在同一块内的任意两点之间要有一条路,那么其实就是对于一块内的强连通分量,至少要有一条路径贯穿所有分量.

COGS728. [网络流24题] 最小路径覆盖问题

算法实现题8-3 最小路径覆盖问题(习题8-13) ´问题描述: 给定有向图G=(V,E).设P是G的一个简单路(顶点不相交)的集合.如果V中每个顶点恰好在P的一条路上,则称P是G的一个路径覆盖.P中路径可以从V的任何一个顶点开始,长度也是任意的,特别地,可以为0.G的最小路径覆盖是G的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G的最小路径覆盖. 提示: 设V={1,2,...  ,n},构造网络G1=(V1,E1)如下: 每条边的容量均为1.求网络G1的(x0,y0)最大流.

有向无环图(DAG)的最小路径覆盖

DAG的最小路径覆盖 定义:在一个有向图中,找出最少的路径,使得这些路径经过了所有的点. 最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖. 最小不相交路径覆盖:每一条路径经过的顶点各不相同.如图,其最小路径覆盖数为3.即1->3>4,2,5. 最小可相交路径覆盖:每一条路径经过的顶点可以相同.如果其最小路径覆盖数为2.即1->3->4,2->3>5. 特别的,每个点自己也可以称为是路径覆盖,只不过路径的长度是0. DAG的最小不相交路径覆盖 算法:把原图的每个点