首页 > 系统服务 > 详细

【UVA1194】Machine Schedule

时间:2019-04-02 12:57:13      阅读:104      评论:0      收藏:0      [点我收藏+]

题目大意:给定 N 个任务和两台机器,每个任务可以在任意一台机器上执行,每台机器有 N 个启动状态,不同任务需要机器在不同的状态下执行,求执行所有任务需要多少个不同的状态。

题解:由于一个任务一定要被两台机器中的一台执行,可以将任务看作边,连接两台机器的对应启动状态。所要求的是这个二分图的最大独立集,因此,只需求出其最大匹匹数即可。

代码如下

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
//const int maxn=
const double eps=1e-6;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll sqr(ll x){return x*x;}
inline ll read(){
    ll x=0,f=1;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
    do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
    return f*x;
}
/*--------------------------------------------------------*/

vector<int> G[101];
int match[101];bool vis[101];
int n,m,q,ans;

void read_and_parse(){
    m=read(),q=read();
    for(int i=1;i<=q;i++){
        int d=read(),x=read(),y=read();
        G[x].pb(y);
    }
}

bool dfs(int u){
    for(auto v:G[u])if(!vis[v]){
        vis[v]=1;
        if(!match[v]||dfs(match[v])){
            match[v]=u;return 1;
        }
    }
    return 0;
}

void solve(){
    for(int i=1;i<=n;i++){
        memset(vis,0,sizeof(vis));
        if(dfs(i))++ans;
    }
    printf("%d\n",ans);
}

void init(){
    ans=0;
    for(int i=1;i<=100;i++)G[i].clear();
    memset(match,0,sizeof(match));
}

int main(){
    while(n=read()){
        init();
        read_and_parse();
        solve();
    }
    return 0;
}

【UVA1194】Machine Schedule

原文:https://www.cnblogs.com/wzj-xhjbk/p/10641660.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!