二分匹配之HDU1150 Machine Schedule

来源:互联网 发布:物流网络包括 编辑:程序博客网 时间:2024/05/16 01:06

求最小点覆盖数。

唯一需要注意的是起始机器都为0,所以输入时候需要0状态能完成的工作就可以直接完成,不需要放到二分匹配里面去了。

#include <stdio.h>#include <ctype.h>#include <string.h>#include <stdlib.h>#include <limits.h>#include <math.h>#include <algorithm>#include <stack>#include <queue>#include <vector>#include <map>#include <set>#include <string>#include <sstream>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef long long LL;const double pi=4.0*atan(1.0);const int MAXN=10005;vector<int> g[MAXN];int used[MAXN],linker[MAXN];int uN;int dfs(int u){for(int i=0;i<g[u].size();i++){int v=g[u][i];if(!used[v]){used[v]=1;if(linker[v]==-1||dfs(linker[v])){linker[v]=u;return 1;}}}return 0;}int hungary(){memset(linker,-1,sizeof(linker));int ans=0;for(int i=1;i<uN;i++){memset(used,0,sizeof(used));if(dfs(i))ans++;}return ans;}int main(){int n,m;int i,j,k;int x,y;while(scanf("%d",&n)!=EOF){if(n==0)return 0;scanf("%d%d",&m,&k);for(i=0;i<=n;i++)g[i].clear();for(i=0;i<k;i++){scanf("%d%d%d",&j,&x,&y);if(x==0||y==0)continue;g[x].push_back(y);}uN=n;printf("%d\n",hungary());}return 0;}


0 0
原创粉丝点击