• AcWing376 机器任务(最小点覆盖)


    比较容易看出是最小点覆盖问题,并且本题因为只有两种机器,所以是二分图问题,将对应的任务的两种机器连边

    答案就是求取最大匹配数。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int n,m,k;
    int match[N];
    int g[200][200];
    int st[200];
    int find(int u){
        int i;
        for(i=1;i<m;i++){
            if(!st[i]&&g[u][i]){
                st[i]=1;
                if(match[i]==-1||find(match[i])){
                    match[i]=u;
                    return true;
                }
            }
        }
        return false;
    }
    int main(){
        while(cin>>n>>m>>k){
            if(n+m+k==0)
            break;
            int i;
            memset(match,-1,sizeof match);
            memset(g,0,sizeof g);
            for(i=1;i<=k;i++){
                int t,a,b;
                cin>>t>>a>>b;
               if(!a||!b)
               continue;
               g[a][b]=1;
            }
            int res=0;
            for(i=1;i<n;i++){
                memset(st,0,sizeof st);
                if(find(i))
                    res++;
            }
            cout<<res<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    java基础测试
    java随笔
    Android 开机广播的使用
    ZOJ 3715 Kindergarten Election
    LightOJ 1051
    LightOJ 1042
    LightOJ 1049
    LightOJ 1048
    LeightOJ 1046
    LightOJ 1045
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13217566.html
Copyright © 2020-2023  润新知