poj 1325 Machine Schedule 最小顶点覆盖

题意

  两个机器A,B, 分别有 N,M个工作模式, K个作业,可以在( Ai, Bj ) 模式下工作. 机器最初在模式0下.

问最小的 切换模式次数.

 

解题思路

  A, B 两个天然二分图顶点集合,   A,B机器上的两个模式之间连边即为 作业K. 

  最小的切换次数, 即为 最小顶点覆盖数.

  特殊的定理是, 二分图中  最小顶点覆盖 = 最大匹配.  (仅仅在二分图中满足. 主要是由于最大独立点集导致)

#include<stdio.h>

#include<string.h>

#include<stdlib.h>



const int N = 110;



int n, m, k;

int ma[N], mb[N];



bool g[N][N], vis[N];



int path( int u ){

    for(int v = 1; v < m; v++){

        if( g[u][v] && !vis[v] ){

            vis[v] = 1;

            if( ma[v] == -1 || path( ma[v] ) ){

                ma[v] = u; mb[u] = v;

                return 1;    

            }

        }    

    }    

    return 0;

}

int main(){

    while( scanf("%d", &n), n ){

        scanf("%d%d", &m,&k);

        memset( g, 0, sizeof(g) );

        int x, a, b;

        for(int i = 0; i < k; i++){

            scanf("%d%d%d", &x,&a, &b);

            g[a][b] = 1;

        }

        memset( ma, 0xff, sizeof(ma) );

        memset( mb, 0xff, sizeof(mb) );

        int res = 0;

        for(int i = 1; i < n; i++){

            if( mb[i] == -1 ){

                memset( vis, 0, sizeof(vis));

                res += path( i );

            }

        }

        printf("%d\n", res );

        

    }    

    return 0;

}

 

你可能感兴趣的:(schedule)