当前位置:编程学习 > C/C++ >>

poj 1325 Machine Schedule--最小点覆盖

[cpp]
/*
题意:A机器有n(0~n-1)个模式,B机器有m(0~m-1)个模式
先有k个任务需要做,可以用A机器的ai模式做或者用B机器的bi模式做
任务无先后,换模式序重启,开始两个机器都在模式0
 
问最少需要重启几次
 
二分图最小点覆盖
 
A的模式为X集  B的模式为Y集
 
按任务建边
 
求最小点覆盖
 
任务是求最少的重启次数,也就是最少要工作在几个模式(除了0模式)
只要边的任何一个端点被选中就行了
 
所以求最小点覆盖  这些点抓住了所有的边,集完成了所有任务,模式就是这个店所代表的模式
 
最小点覆盖=二分图最大匹配
*/ 
#include<stdio.h>  
#include<vector>  
using namespace std; 
int n,m,k; 
vector<int>v[201]; 
int vis[201]; 
int match[201]; 
int dfs(int i) 

    for(int j=0;j<v[i].size();++j) 
    { 
        if(!vis[v[i][j]+n])//+n是调整编号  
        { 
            vis[v[i][j]+n]=1; 
            if(match[v[i][j]+n]==-1||dfs(match[v[i][j]+n])) 
            { 
                match[v[i][j]+n]=i; 
                return 1; 
            } 
        } 
    } 
    return 0; 

int main() 

    int i,a,b,c; 
    while(scanf("%d",&n),n) 
    { 
        scanf("%d%d",&m,&k); 
        for(i=0;i<=m+n;++i) 
            v[i].clear(); 
        for(i=1;i<=k;++i) 
        { 
            scanf("%d%d%d",&a,&b,&c); 
            if(b&&c) 
                v[b].push_back(c);//只需要从X集指向Y集就好了 dfs()的时候就只是从X到Y  
        } 
        a=0;////匹配部分  
        memset(match,-1,sizeof(match)); 
        for(i=1;i<=n;i++) 
        { 
            memset(vis,0,sizeof(vis)); 
            if(dfs(i)) 
                a++; 
        }////  
        printf("%d\n",a); 
    } 
    return 0; 

作者:qq172108805
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,