程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 1325 Machine Schedule--最小點覆蓋

poj 1325 Machine Schedule--最小點覆蓋

編輯:C++入門知識

[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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved