zoukankan      html  css  js  c++  java
  • POJ

    题目大意:有两个机器,A机器有n种工作模式,B机器有m种工作模式,刚開始两个机器都是0模式。假设要切换模式的话,机器就必须的重新启动
    有k个任务,每一个任务都能够交给A机器的i模式或者B机器的j模式完毕,问要重新启动多少次机器才干完毕任务

    解题思路:两个机器的点分为两个点集。点集之间的关系就是任务了。要将全部任务都完毕。就要将全部边都覆盖掉,所以就是求最小点覆盖了。


    这里有一个点要注意。假设全部任务中都有一个0,那么机器就不用重新启动了,重新启动次数就为0了(由于刚開始都是0)

    #include<cstdio>
    #include<vector>
    #include<cstring>
    using namespace std;
    const int N = 110;
    int n, m, k;
    int vis[N], link[N];
    bool flag;
    vector<int> g[N];
    
    void init() {
    
        for(int i = 1; i < n; i++)
            g[i].clear();
    
        int x, y, z;
        for(int i = 0; i < k; i++) {
            scanf("%d%d%d", &x, &y, &z);
            if(y * z == 0)
                continue;
            g[y].push_back(z);
        }
        memset(link, -1, sizeof(link));
    }
    
    bool dfs(int u) { 
        for(int i = 0; i < g[u].size(); i++) {
            int v = g[u][i];
            if(vis[v])
                continue;
            vis[v] = 1;
            if(link[v] == -1 || dfs(link[v])) {
                link[v] = u;
                return true;
            }
        }
        return false;
    }
    
    void hungary() {
        int ans = 0;
        for(int i = 1; i < n; i++) {
            memset(vis, 0, sizeof(vis));
            if(dfs(i))
                ans++;
        }
        printf("%d
    ",ans);
    }
    
    int main() {
        while(scanf("%d", &n) != EOF && n) {
            scanf("%d%d", &m, &k);
            init();
            hungary();
        }
        return 0;
    }
  • 相关阅读:
    用GDB调试程序(一)
    vim添加删除多行注释
    python binary lib on win/各种python库的二进制包
    python使用libssh2连接linux
    python xpath
    splinter python浏览器自动化操作,模拟浏览器的行为
    pytesser图片文本识别
    python验证码识别
    Python 之 使用 PIL 库做图像处理
    Connection reset by peer问题分析
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7338485.html
Copyright © 2011-2022 走看看