POJ 1325 Machine Schedule 二分图 最小点覆盖

原创 2013年12月03日 15:12:21

题目大意:有两台机器,分别有m,n个状态,最开始的时候都位于状态0,现在给定了k个任务,每个任务都可以在A的某一个状态或B的某一个状态运行,求问完成所有的任务所需的切换机器状态的总次数


机器的每一个状态用一个点表示,显然这是一个二分图,如果在每个任务指定的两个状态连一条线的话就可以用一条边代表这个任务,而让这个任务在某台机器上执行就是给这条边选择一个端点,每切换一次状态就是选择一个点,那么这道题就转化为了:求最少的顶点,使边集中的每一条边都与某个顶点关联,即求二分图的最小点覆盖

再由Konig定理,二分图的最小点覆盖数=最大匹配数,那么用匈牙利算法就可以解决了~

(顺便查了一下才知道原来Konig就是柯尼希啊~不知道这个定理和物理学的质点动能那个定理有啥关系没......)


关于匈牙利算法:

算法思想很简单,不断的找增广路,然后把路上的边取反(实际操作上改一下匹配的对应关系就可以了),直到找不到为止,实现起来也很容易

另外对于这道题,因为最开始两台机器的状态都是0,所以与0相连的边是不需要转换状态的,这些边当成不存在就好了


下面是具体的代码

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctype.h>
#define MAXN 300

int a[MAXN][MAXN]; // 邻接矩阵
int match[MAXN]; // 标记Y集中的顶点匹配的对象,未匹配为-1
int vis[MAXN]; // 在某一次访问的过程中Y集中的该点是否被访问
int nx, ny; // xy集元素的个数
int total; // 最大匹配数目

// 从X集中的v点出发,寻找一条增广路
// 如果能找到返回true
bool find(int v)
{
    // 枚举每一个y集中的点
    for (int i = 0; i < ny; ++i)
    {
        // 若这两点间存在边而且i点尚未访问
        if (a[v][i] && !vis[i])
        {
            vis[i] = 1;
            // 递归终点为match[i] = -1,即增广路的另一个端点
            // 若该点有匹配,查看是否存在从对应匹配点出发的增广路
            if (match[i] == -1 || find(match[i]))
            {
                match[i] = v; // 修改匹配对象
                return true;
            }
        }
    }
    return false;
}

// 读入整数
inline void scan(int &x)
{
    char c;
    while ((c = getchar()) && !isdigit(c));
    x = c - '0';
    while ((c = getchar()) && isdigit(c))
    {
        x = x * 10 + c - '0';
    }
}

// 图初始化
void init()
{
    int k;
    total = 0;
    memset(match, -1, sizeof(match));
    memset(a, 0, sizeof(a));
    scan(k);
    for (int i = 0; i < k; ++i)
    {
        int t, b, c;
        scan(t); scan(b); scan(c);
        if (b == 0 || c == 0)
            continue;
        a[b][c] = 1;
    }
}

int main()
{
    int t;

    while (1)
    {
        scan(nx);
        if (nx == 0)
            break;
        scan(ny);
        init();
        for (int i = 0; i < nx; ++i)
        {
            // 枚举每一个起点,重置访问标记
            // 若找到增广路则长度+1
            memset(vis, 0, sizeof(vis));
            if (find(i))
            {
                ++total;
            }
        }
        /*for (int i = 0; i < ny; ++i)
        {
            printf("%d: %d\n", i, match[i]);
        }*/
        printf("%d\n", total);
    }
    return 0;
}


求解二分图的最大匹配的匈牙利算法---POJ 1325 Machine Schedule

【基本概念】 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U、V中的顶点...
  • u011523762
  • u011523762
  • 2016年07月27日 15:47
  • 408

poj1325 - Machine Schedule

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                               ...
  • wangjian8006
  • wangjian8006
  • 2012年09月10日 15:11
  • 1116

poj 1325 Machine Schedule 二分图最小点覆盖=最大匹配

Description As we all know, machine scheduling is a very classical problem in computer science and ...
  • kongming_acm
  • kongming_acm
  • 2011年09月21日 09:01
  • 531

POJ - 1325 Machine Schedule 二分图 最小点覆盖

题目大意:有两个机器,A机器有n种工作模式,B机器有m种工作模式,刚开始两个机器都是0模式,如果要切换模式的话,机器就必须的重启 有k个任务,每个任务都可以交给A机器的i模式或者B机器的j模式完成,...
  • L123012013048
  • L123012013048
  • 2015年06月11日 09:58
  • 581

POJ 1325 Machine Schedule 二分图最小点覆盖

题意: 有A,B两个机器,分别有n,m个档位,有k件工作,可以由x档位的A机器或者y档位的B机器完成。 问,可以改变完成工作的顺序,使切换档位的次数最小。 每件工作对应2个完成的档位,可以构建二...
  • kdqzzxxcc
  • kdqzzxxcc
  • 2012年07月13日 15:57
  • 412

POJ 1325 Machine Schedule (最小点覆盖 && 二分图最大匹配)

鏈接: http://poj.org/problem?id=1325 Description As we all know, machine scheduling is a very class...
  • u012823258
  • u012823258
  • 2014年10月18日 15:05
  • 725

poj 1325 Machine Schedule(二分图的最小点覆盖)

Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...
  • u012860428
  • u012860428
  • 2014年11月09日 00:35
  • 549

poj 1325 Machine Schedule (最小点覆盖)

题目大意:两个机器A、B有各种工作模式0,1,2,……。初始都处于0模式。每切换一次模式需要重启一次机器。现在给你k个任务,给出它们分别在A、B中工作的模式,让你合理安排使得重启机器次数最少,完成所有...
  • u014679804
  • u014679804
  • 2015年07月05日 16:17
  • 233

POJ 1325 Machine Schedule(最小点覆盖)

POJ 1325 Machine Schedule 题目链接 题意:有两台机器分别有n和m种模式,一开始都在0模式下,现在有k个任务,每个任务要么由a机的x模式要么由b机器的y模式完成,完...
  • u011217342
  • u011217342
  • 2014年10月29日 21:27
  • 432

POJ 1325 Machine Schedule 最小点覆盖

机器A的所有模式为左部顶点,机器B的所有模式为右部顶点,然后A与B之间的每条连线代表一个任务或工作 之后就要完成所有的任务,即将每条边都覆盖 对一个有向图,若要覆盖每条边,至少需要的点数为二分图最...
  • sdj222555
  • sdj222555
  • 2012年02月19日 13:39
  • 647
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1325 Machine Schedule 二分图 最小点覆盖
举报原因:
原因补充:

(最多只允许输入30个字)