• 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;
    }
  • 相关阅读:
    Swing中如何比较好的判断鼠标左键双击
    学习rsyslog
    学习rsync
    在线手册
    Linux开源镜像站大全
    Linux命令
    Android使用sqlite数据库的使用
    Android学习笔记-listview实现方式之BaseAdapter
    Android学习笔记-保存数据的实现方法2-SharedPreferences
    Android学习笔记-获取手机内存,SD卡存储空间。
  • 原文地址:https://www.cnblogs.com/jifahu/p/5723240.html
Copyright © 2020-2023  润新知