题意:
       有k个任务,两个机器,第一个机器有n个模式,第二个机器有m个模式,每个任务要么在第一个机器的一个模式下工作,要么在第二个机器的一个模式下工作,机器每切换一个模式需要重启一次,两个机器一开始都处于第0个模式下,问完成这k个任务至少切换多少次模式(任务完成顺序无所谓)。

思路:
      把每个任务的两个点连成一条边,然后就是说每个边肯定要先则这条边的两个端点中的一个,所有的边都要这样做,这不就是最少顶点覆盖了吗,直接一遍二分匹配就行了,或者是一遍最大流,线面是两种方法的代码,题目比较简单,就说这么多吧。

二分匹配,匈牙利(最少顶点覆盖=最大匹配数)

#include<stdio.h>
#include<string.h>

#define N_node 200 + 10
#define N_edge 1000 + 100

typedef struct
{
    int to ,next;
}STAR;

STAR E[N_edge];
int list[N_node] ,tot;
int mkdfs[N_node] ,mkgx[N_node];

void add(int a ,int b)
{
    E[++tot].to = b;
    E[tot].next = list[a];
    list[a] = tot;
}

int DFS_XYL(int s)
{
    for(int k = list[s] ;k ;k = E[k].next)
    {
        int to = E[k].to;
        if(mkdfs[to]) continue;
        mkdfs[to] = 1;
        if(mkgx[to] == -1 || DFS_XYL(mkgx[to]))
        {
            mkgx[to] = s;
            return 1;
        }
    }
    return 0;
}

int main ()
{
    int n ,m, k ,a ,b ,c ,i;
    while(~scanf("%d" ,&n) && n)
    {
        scanf("%d %d" ,&m ,&k);
        memset(list ,0 ,sizeof(list));
        tot = 1;
        for(i = 1 ;i <= k ;i ++)
        {
            scanf("%d %d %d" ,&a ,&b ,&c);
            if(!b || !c) continue;
            add(b + 1 ,c + 1);
        }
        memset(mkgx ,255 ,sizeof(mkgx));
        int Ans = 0;
        for(i = 1 ;i <= n ;i ++)
        {
            memset(mkdfs ,0 ,sizeof(mkdfs));
            Ans += DFS_XYL(i);
        }
        printf("%d\n" ,Ans);
    }
    return 0;
}

DINIC求最大匹配
#include<queue>
#include<stdio.h>
#include<string.h>

#define N_node 250
#define N_edge 3000
#define INF 1000000000

using namespace std;

typedef struct
{
    int to ,next ,cost;
}STAR;

typedef struct
{
    int x ,t;
}DEP;

STAR E[N_edge];
DEP xin ,tou;
int list[N_node] ,listt[N_node] ,tot;
int deep[N_node];

void add(int a ,int b ,int c)
{
    E[++tot].to = b;
    E[tot].cost = c;
    E[tot].next = list[a];
    list[a] = tot;

E[++tot].to = a;
    E[tot].cost = 0;
    E[tot].next = list[b];
    list[b] = tot;
}

bool BFS_Deep(int s ,int t ,int n)
{
    memset(deep ,255 , sizeof(deep));
    xin.x = s ,xin.t = 0;
    deep[s] = 0;
    queue<DEP>q;
    q.push(xin);
    while(!q.empty())
    {
        tou = q.front();
        q.pop();
        for(int k = list[tou.x] ;k ;k = E[k].next)
        {
            xin.x = E[k].to;
            xin.t = tou.t + 1;
            if(deep[xin.x] != -1 || !E[k].cost)
            continue;
            deep[xin.x] = xin.t;
            q.push(xin);
        }
    }
    for(int i = 0 ;i <= n ;i ++)
    listt[i] = list[i];
    return deep[t] != -1;
}

int minn(int x ,int y)
{
    return x < y ? x : y;
}

int DFS_Flow(int s ,int t ,int flow)
{
    if(s == t) return flow;
    int nowflow = 0;
    for(int k = listt[s] ;k ;k = E[k].next)
    {
        int to = E[k].to;
        int c = E[k].cost;
        listt[s] = k;
        if(deep[to] != deep[s] + 1 || !c)
        continue;
        int tmp = DFS_Flow(to ,t ,minn(c ,flow - nowflow));
        nowflow += tmp;
        E[k].cost -= tmp;
        E[k^1].cost += tmp;
        if(nowflow == flow)
        break;
    }
    if(!nowflow) deep[s] = 0;
    return nowflow;
}

int DINIC(int s ,int t ,int n)
{
    int Ans = 0;
    while(BFS_Deep(s ,t ,n))
    {
        Ans += DFS_Flow(s ,t ,INF);
    }
    return Ans;
}

int main ()
{
    int n ,m ,k ,i ,a ,b ,c;
    while(~scanf("%d" ,&n) && n)
    {
        scanf("%d %d" ,&m ,&k);
        memset(list ,0 ,sizeof(list));
        tot = 1;
        for(i = 1 ;i <= k ;i ++)
        {
            scanf("%d %d %d" ,&a ,&b ,&c);
            if(!b || !c) continue;
            b ++ ,c ++;
            add(b ,c + n ,1);
        }
        for(i = 1 ;i <= n ;i ++)
        add(0 ,i ,1);
        for(i = 1 ;i <= m ;i ++)
        add(i + n ,n + m + 1 ,1);
        printf("%d\n" ,DINIC(0 ,m + n + 1 ,m + n + 1));
    }
    return 0;
}

POJ1325二分匹配或者DINIC(最小路径覆盖)相关推荐

  1. 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 -最大二分匹配)...

    [题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个 顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何 ...

  2. 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配

    二分图匹配 二分图大讲堂--彻底搞定最大匹配数(最小覆盖数).最大独立数.最小路径覆盖.带权最优匹配(转) 文本内容框架: §1图论点.边集和二分图的相关概念和性质 §2二分图最大匹配求解 匈牙利算法 ...

  3. hiho 第118周 网络流四·最小路径覆盖

    描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游 ...

  4. 最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

    在讲述这两个算法之前,首先有几个概念需要明白: 二分图:  二分图又称二部图,是图论中的一种特殊模型.设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边( ...

  5. 有向图最小路径覆盖方法浅析、证明 //hdu 3861

    路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联. 对于一个有向无环图怎么求最小路径覆盖? 先构造二分图: 对于原图,先拆点,吧每个点i拆成ii,iii. ...

  6. 二分图专题系列各大知识点总结(匈牙利,染色法,最大独立集,最小点覆盖,最小路径覆盖)

    本文概论 二分图的判断方法:图中不存在奇数环----->染色法判断二分图不存在矛盾 二分图: 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i, ...

  7. 流网络的最小割问题c语言,「网络流24题」最小路径覆盖问题

    Description 问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任 ...

  8. 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)

    D.魔术球问题(有向无环图的最小路径覆盖.思维)[省选/NOI- ] P2765 魔术球问题 [问题分析] 枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决. [ ...

  9. 【网络流24题】解题报告:C、最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)

    C.最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)[省选/NOI- ] 拆点最大流 [问题分析] 有向无环图最小路径覆盖,可以转化成二分图最大匹配问题,从而用最大流解决. [建模方法] 构造二分 ...

最新文章

  1. UISlider 滑竿控件
  2. 【转】Android -- Looper.prepare()和Looper.loop()
  3. Hibernate4一对一关系映射(唯一外键方式)
  4. springMVC教程--拦截器详解
  5. python time sleep和wait_Python和硒:driver.implicitly_wait()和time.sleep()之间的区别...
  6. .net里面实现javascript中的 escape 和 unescape 功能
  7. 接口返回xml格式的数据_接口测试之Jmeter串联xml数据格式请求
  8. java 出栈_Java开发中巧妙使用链表来实现模拟栈的入栈出栈操作
  9. 【转载】StreamInsight系列-QueryTemplate\QueryBinder\Query
  10. 首届 “女生科技体验节” 大爆料!
  11. java对人脸打马赛克,如何给视频中的人脸进行马赛克 视频人脸打马赛克软件|人脸跟踪马赛克...
  12. 华三服务器管理口地址_H3C服务器配置HDM远程管理系统
  13. android开发点击版本号多次无法进入开发者模式模式
  14. Python中的BMI指数
  15. 软考:嵌入式系统设计师——易错知识点总结
  16. 【金三银四】 一文弄懂 js 数据类型、堆栈内存、作用域(链)、闭包知识拓展 (一)
  17. 测试用例----测试大纲法
  18. Python灰色关联度
  19. 什么是模块化与模块化的优缺点
  20. 企业营销获客为什么要选SEO?低预算适合做SEO吗?【必看】

热门文章

  1. make 学习体会(一)
  2. EF-DbUpdateException解决方案
  3. NIST发布网络安全劳动力框架
  4. 图解人工智能机器学习深度学习的关系和区别
  5. 【BZOJ5461】 【PKUWC2018】—Minimax(线段树合并优化dp)
  6. PHP 设计模式系列 —— 资源库模式(Repository)
  7. Redis的安装部署
  8. Leetcode0037--Sudoku Solver 数独游戏
  9. 设计模式:迭代器模式
  10. hdu-5900 QSC and Master(区间dp)