洛谷 P2764 最小路径覆盖问题【匈牙利算法】

经典二分图匹配问题。把每个点拆成两个,对于原图中的每一条边(i,j)连接(i,j+n),最小路径覆盖就是点数n-二分图最大匹配。方案直接顺着匹配dsf。。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=505,M=120005;
int n,m,h[N],cnt,lk[N],t,v[N],ans;
struct qwe
{
    int ne,to;
}e[M];
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p>‘9‘||p<‘0‘)
    {
        if(p==‘-‘)
            f=-1;
        p=getchar();
    }
    while(p>=‘0‘&&p<=‘9‘)
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
void add(int u,int v)
{
    cnt++;
    e[cnt].ne=h[u];
    e[cnt].to=v;
    h[u]=cnt;
}
bool findd(int u)
{
    for(int i=h[u];i;i=e[i].ne)
        if(v[e[i].to]!=t)
        {
            v[e[i].to]=t;
            if(!lk[e[i].to]||findd(lk[e[i].to]))
            {
                lk[e[i].to]=u;
                lk[u]=e[i].to;
                return 1;
            }
        }
    return 0;
}
void prin(int u)
{
    u+=n;
    do
        printf("%d ",u=u-n);
    while(v[u]=t,u=lk[u]);
    puts("");
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=m;i++)
    {
        int x=read(),y=read();
        add(x,y+n);
    }
    for(int i=1;i<=n;i++)
        if(!lk[i])
        {
            t++;
            if(findd(i))
                ans++;
        }
    t++;
    for(int i=1;i<=n;i++)
        if(v[i]!=t)
            prin(i);
    printf("%d\n",n-ans);
    return 0;
}

原文地址:https://www.cnblogs.com/lokiii/p/8424465.html

时间: 2024-10-07 12:55:37

洛谷 P2764 最小路径覆盖问题【匈牙利算法】的相关文章

洛谷2764 最小路径覆盖问题

问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0.G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G 的最小路径覆盖. 编程任务: 对于给定的给定有向无环图G,编程找出G的一个最小路径覆盖. Input Format 文件第1 行有2个正整数n和m.n是给定有向无环图G 的顶点数,m是

[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 */

P2764 最小路径覆盖问题(网络流24题之一)

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

P2764 最小路径覆盖问题

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

luogu P2764 最小路径覆盖问题

DAG的最小不相交路径覆盖板子 #include<bits/stdc++.h> using namespace std; int ans=0,len=0,lin[500],din[50000],dout[50000],level[500],x,y,S,T,n,m,q[500]; int q1[500],q2[500],tail1=0,tail2=0; bool f[500]; struct one { int x,y,v,next,reverse; }; one e[30000]; void

洛谷 P2764 LibreOJ 6002 最小路径覆盖问题

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

匈牙利算法 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

Antenna Placement POJ - 3020 二分图匹配 匈牙利 拆点建图 最小路径覆盖

题意:图没什么用  给出一个地图 地图上有 点 一次可以覆盖2个连续 的点( 左右 或者 上下表示连续)问最少几条边可以使得每个点都被覆盖 最小路径覆盖       最小路径覆盖=|G|-最大匹配数                   证明:https://blog.csdn.net/qq_34564984/article/details/52778763 证明总的来说就是尽可能多得连边 边越多 可以打包一起处理得点就越多(这里题中打包指连续得两个点只需要一条线段就能覆盖) 拆点思想   :匈牙

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

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