poj 1325 二分图最小点覆盖(机器模式的选择)

来源:互联网 发布:刘备是汉室宗亲吗 知乎 编辑:程序博客网 时间:2024/05/01 10:06

题意:机器A有n(0~n-1)个模式,机器B有m(0~m-1)个模式。有k个任务,可以用机器A的i模式做或用机器B的j模式做。任务无先后,换模式需重启机器,开始时两个机器都在模式0,且已经开机。问最少需要开机多少次。

思路:求最小点覆盖。最小点覆盖=最大匹配。故为hungary模板。注意可以用两个机器模式0做的就不必考虑了。

#include <stdio.h>#include <string.h>#define N 105#define M 1005int map[N][N];int visited[N],link[N];int n,m,k;int dfs(int i){int j;for(j = 0;j<m;j++)if(!visited[j] && map[i][j]){visited[j] = 1;if(link[j]==-1 || dfs(link[j])){link[j] = i;return 1;}}return 0;}int hungary(){int i,res=0;for(i = 0;i<n;i++){memset(visited,0,sizeof(visited));if(dfs(i))res++;}return res;}int main(){freopen("a.txt","r",stdin);while(scanf("%d",&n)&&n){int i,a,b;memset(map,0,sizeof(map));memset(link,-1,sizeof(link));scanf("%d %d",&m,&k);while(k--){scanf("%d %d %d",&i,&a,&b);if(a&&b)map[a][b] = 1;}printf("%d\n",hungary());}return 0;}


0 0
原创粉丝点击