• 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;
    }
  • 相关阅读:
    五、Java对象和类
    四、JavaString字符串
    三、Java语句
    二、Java基本数据类型
    一、Java主类结构
    bat常用命令
    iOS 如何获得app的版本和系统的版本
    英语----时态---将来时态的四种对比
    英语----时态---将来时态的
    英语----时态---现在进行时与过去进行时
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7338485.html
Copyright © 2020-2023  润新知