ZOJ 1364 Machine Schedule (二分图最大匹配)

来源:互联网 发布:如何做淘宝美工 编辑:程序博客网 时间:2024/05/16 06:24

解题思路:二分图最大匹配模板题  每一个任务在AB两种机器模式上连边,最小点覆盖数 = 最大匹配数

AC代码:

/*    @Author: wchhlbt    @Date:   2017/7/31*/#include <bits/stdc++.h>#define Fori(x) for(int i=0;i<x;i++)#define Forj(x) for(int j=0;j<x;j++)#define maxn 500#define inf 0x3f3f3f3f#define ONES(x) __builtin_popcount(x)#define _  << "  " <<using namespace std;typedef long long ll ;const double eps =1e-8;const int mod = 1000000007;typedef pair<int, int> P;const double PI = acos(-1.0);int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};int read(){ int num;    scanf("%d",&num);   return num;}int p,n;//匈牙利算法//注意给nx,ny赋值int vis[maxn];//存储每个点是否被访问过int g[maxn][maxn];//邻接矩阵int cx[maxn];//cx[i]表示最终求得的最大匹配中与xi匹配的y顶点int cy[maxn];int nx,ny;//分别存储x集合和y集合中的顶点个数int dfs(int u){    for(int v = 1; v<=ny; v++){//遍历Y集合        if(g[u][v] && !vis[v]){            vis[v] = 1;            if(cy[v]==-1 || dfs(cy[v])){               cx[u] = v;               cy[v] = u;               return 1;             }        }    }    return 0;}int MaxMatch(){    int res = 0;    memset(cx,-1,sizeof cx);    memset(cy,-1,sizeof cy);    for(int i = 1; i<=nx; i++){//遍历X集合        if(cx[i]==-1){            memset(vis,0,sizeof vis);            res += dfs(i);        }    }    return res;}int main(){    //freopen("test.txt","r",stdin);     int n,m,k;    while(~scanf("%d",&n) && n){        scanf("%d%d",&m,&k);        memset(g,0,sizeof g);        for(int i = 1; i<=k; i++){            int id,x,y;            scanf("%d%d%d",&id,&x,&y);            g[x][y] = 1;        }        nx = n;        ny = m;        int ans = MaxMatch();        cout << ans << endl;    }    return 0;}/*unsigned   int   0~4294967295int   2147483648~2147483647unsigned long 0~4294967295long   2147483648~2147483647long long的最大值:9223372036854775807long long的最小值:-9223372036854775808unsigned long long的最大值:18446744073709551615__int64的最大值:9223372036854775807__int64的最小值:-9223372036854775808unsigned __int64的最大值:18446744073709551615*/


阅读全文
0 0
原创粉丝点击