「网络流 24 题」3.最小路径覆盖

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=50004;
int n,S,T,head[maxn],nxt[maxn],mark[maxn],dep[maxn],cnt=0,ans;
struct node{
    int to,next,w;
}e[maxn];
inline void add(int u,int v,int w){
    e[cnt].to=v;e[cnt].next=head[u];e[cnt].w=w;head[u]=cnt++;
}
inline int bfs(){
    queue<int>q;
    memset(dep,-1,sizeof(dep));
    dep[S]=0;q.push(S);
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int i=head[u];i!=-1;i=e[i].next){
            int v=e[i].to;
            if(dep[v]==-1&&e[i].w>0){
                dep[v]=dep[u]+1;
                q.push(v);
            }
        }
    }
    return dep[T]!=-1;
}
inline int dfs(int u,int c){
    if(u==T) return c;
    int f=0;
    for(int i=head[u];i!=-1&&f<c;i=e[i].next){
        int v=e[i].to;
        if(e[i].w>0&&dep[e[i].to]==dep[u]+1){
            int x=dfs(e[i].to,min(e[i].w,c-f));
            f+=x;
            e[i].w-=x;
            e[i^1].w+=x;
        }
    }
    if(!f) dep[u]=-2;
    return f;
}
inline void dicnic(){
    while(bfs()) ans-=dfs(S,INF);
}
int main(){
    memset(head,-1,sizeof(head));
    scanf("%d",&n);
    int m;scanf("%d",&m);
    S=n<<1|1,T=S+1;
    for(int i=1;i<=m;i++){
        int x,y;scanf("%d%d",&x,&y);
        add(x,y+n,1);add(y+n,x,0);
    }
    for(int i=1;i<=n;i++){
        add(S,i,1);add(i,S,0);
        add(i+n,T,1);add(T,i+n,0);
    }
    ans=n;dicnic();
    for(int i=1;i<=n;i++){
        int k=head[i];
        while(k!=-1){
            if(!e[k].w) {nxt[i]=e[k].to-n;break;}
            k=e[k].next;
        }
    }
    for(int i=1;i<=n;i++){
        if(mark[i]) continue;
        int t=i;
        while(t!=n+1&&t!=n+2){
            mark[t]=1;
            printf("%d ",t);
            t=nxt[t];
        }
        printf("\n");
    }
    printf("%d",ans);
}

原文地址:https://www.cnblogs.com/wifimonster/p/10326369.html

时间: 2024-07-30 11:03:09

「网络流 24 题」3.最小路径覆盖的相关文章

网络流24题之 1738: 最小路径覆盖问题

网络流24题之 1738: 最小路径覆盖问题 最小路径覆盖问题 模板题,求一个图的最小路径覆盖,输出边数和,路径.不会输出路径的跑dinic然后把图输出来就懂了. #include <bits/stdc++.h> using namespace std; int k; struct Dinic { static const int MAXN = 30005 + 7; static const int MAXM = 1e7 + 7; static const int INF = 0x3f3f3f

【网络流24题 #03】最小路径覆盖问题

题目链接:最小路径覆盖问题 哇 卡在输出也是醉了 重要结论:最小路径覆盖数 = 结点数(拆成边之前) -  最大流 本题也是点拆边 与[网络流24题 #04]魔术球问题 有异曲同工之妙 void output(int x){ if(x >= S) return ; printf("%d ", x >> 1); for(int i = head[x]; i != -1; i = edge[i].next) if(!edge[i].w && edge[i]

LiberOJ #6002. 「网络流 24 题」最小路径覆盖

#6002. 「网络流 24 题」最小路径覆盖 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 给定有向图 G=(V,E) G = (V, E)G=(V,E).设 P PP 是 G GG 的一个简单路(顶点不相交)的集合.如果 V VV 中每个顶点恰好在 P PP 的一条路上,则称 P PP 是 G GG 的一个路径覆盖.P PP 中路径可以从 V VV 的任何一个顶点开始,

LiberOJ 6003. 「网络流 24 题」魔术球 贪心或者最小路径覆盖

6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有 n nn 根柱子,现要按下述规则在这 n nn 根柱子中依次放入编号为 1,2,3,4,? 1, 2, 3, 4, \cdots1,2,3,4,? 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2 22 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在 

[loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流

#6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有 n nn 根柱子,现要按下述规则在这 n nn 根柱子中依次放入编号为 1,2,3,4,? 1, 2, 3, 4, \cdots1,2,3,4,? 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2 22 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在

LiberOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题

#6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入格式 文件的第 1 11 行中有 1 11 个正整数 n nn,表示有 n nn 个仓库.第 2 22 行中有 n nn 个

LiberOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 在一个有 m×n m \times nm×n 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意 2 22 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. 输入格式 文件第 1 11 行有 2 22 个正整数 m mm 和 n nn,分别表示棋盘的行数和列数

「网络流24题」2. 太空飞行计划问题

「网络流24题」2. 太空飞行计划问题 <题目链接> 最大权闭合子图. 源点与实验连边权为实验费用的有向边: 仪器与汇点连边权为仪器费用的有向边: 实验与仪器之间连边权为INF的有向边. 答案为所有与源点相连的边的边权和减去图的最小割. 证明见国集队员胡伯涛论文<最小割模型在信息学竞赛中的应用>. 输出路径时,最后一次层次图中: 与源点相连的点即选做的实验:与汇点相连的点即选用的仪器. 注意 ·读入数据时,读到空格继续,否则停止. ·仪器部分的点权+50,避免两部点权相同. #in

「网络流24题」 题目列表

「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分图最小路径覆盖 <3> 4 魔术球问题 <4> 5 圆桌问题 <5> 6 最长递增子序列问题 <6> 7 试题库问题 <7> 8 机器人路径规划问题 <8> 9 方格取数问题 二分图最大点权独立集 <9> 10 餐巾计划问题