zoukankan      html  css  js  c++  java
  • UVALive 2523 Machine Schedule(二分图求最大匹配数)

      题意:有两台机器,上面有多个工作区域,有多个任务,分别可以在两台机器的某一个区域上完成,两台机器一开始都在0区域上工作,每次更改区域,都会重新启动一次,让我们求出最小的重启次数。

      思路:将两个区域连线,使用二分图,求出最大匹配数,容易想明白,正好就是最小重启的次数。

      注意:0一开始就已经完成,不应该加入到匹配序列。

    代码如下:

    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define N 110
    int maps[N][N],n,m,match[N],vis[N];
    bool Find(int x)
    {
        for(int i = 1; i <= m; i++)
        {
            if(maps[x][i] && !vis[i])
            {
                vis[i] = 1;
                if(match[i]==-1|| Find(match[i]))
                {
                    match[i] = x;
                    return true;
                }
            }
        }
        return false;
    }
    int hungry()
    {
        memset(match,-1,sizeof(match));
        int ans = 0;
        for(int i = 1; i <= n; i++)
        {
            memset(vis,0,sizeof(vis));
            if(Find(i)) ans++;
        }
        return ans;
    }
    int main()
    {
        int a,b,c,k;
        // freopen("G.in.cpp","r",stdin);
        while(~scanf("%d",&n))
        {
            if(!n) break;
            scanf("%d%d",&m,&k);
            memset(maps,0,sizeof(maps));
            for(int i = 0; i < k; i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                if(b>0 && c>0)
                    maps[b][c] = 1;
            }
            printf("%d
    ",hungry());
        }
        return 0;
    }
  • 相关阅读:
    Balsamiq Mockups完全手册[转]
    如何成为一个专家
    [ 转]discuz 的加密与解密函数authcode解析
    无题
    [转]Yahoo!网站性能最佳体验的34条黄金守则——内容
    唐僧的家书
    Webservice超时问题
    c#类的初始化顺序
    智力逻辑题程序实现(生日猜测)
    Winform下重写Button按钮
  • 原文地址:https://www.cnblogs.com/jifahu/p/5723240.html
Copyright © 2011-2022 走看看