poj2239 poj1274【二分匹配】

来源:互联网 发布:mac windows 截图 编辑:程序博客网 时间:2024/05/18 02:02

题意:
就是尽可能的选多的课

思路:
把课程和上课的时间看作二分图
跑一跑二分匹配就好了

#include<iostream>#include<cstdio>#include<string.h>#include<algorithm>using namespace std;#define INF 0x3f3f3f3f#define N 350int cos[10][20];int ma[N][N];bool vis[N];int n;int cx[N];int cy[N];int cnt;//建立课程时间的图void init(){    cnt=1;    for(int i=1;i<=7;i++)    {        for(int j=1;j<=12;j++)        {            cos[i][j]=cnt++;        }    }}int findpath(int u){    for(int i=1;i<cnt;i++)    {        if(!vis[i]&&ma[u][i])        {            vis[i]=1;            if(cy[i]==-1||findpath(cy[i]))            {                cy[i]=u;                cx[u]=i;                return 1;            }        }    }    return 0;}int main(){    init();    while(~scanf("%d",&n))    {        memset(ma,0,sizeof(ma));        for(int i=1;i<=n;i++)        {            int x,a,b;            scanf("%d",&x);            for(int j=1;j<=x;j++)            {                scanf("%d%d",&a,&b);                ma[i][cos[a][b]]=1;            }        }        memset(cx,-1,sizeof(cx));        memset(cy,-1,sizeof(cy));        int ans=0;        for(int i=1;i<=n;i++)        {            if(cx[i]==-1)            {                memset(vis,0,sizeof(vis));                ans+=findpath(i);            }        }        printf("%d\n",ans);    }    return 0;}

题意:
(二分匹配基础题)
每个奶牛有自己喜欢去的谷仓,然后问最多有多少奶牛到了自己喜欢的谷仓;
思路:
把牛和谷仓作为二分图,跑一下匈牙利

#include<iostream>#include<cstdio>#include<math.h>#include<stdlib.h>#include<vector>#include<string.h>#include<algorithm>using namespace std;typedef long long LL;#define INF 0x3f3f3f3f#define PI acos(-1.0)#define N 210int cx[250];int cy[250];bool vis[250];int ma[250][250];int n,m;int fun(int x){    for(int i=1;i<=m;i++)    {        if(!vis[i]&&ma[x][i])        {            vis[i]=1;            if(cy[i]==-1||fun(cy[i]))            {                cx[x]=i;                cy[i]=x;                return 1;            }        }    }    return 0;}int main(){    while(~scanf("%d%d",&n,&m))    {        int si;        memset(ma,0,sizeof(ma));        for(int i=1;i<=n;i++)        {            scanf("%d",&si);            for(int j=1;j<=si;j++)            {                int x;                scanf("%d",&x);                ma[i][x]=1;            }        }        int ans=0;        memset(cx,-1,sizeof(cx));        memset(cy,-1,sizeof(cy));        for(int i=1;i<=n;i++)        {            if(cx[i]==-1)            {                memset(vis,0,sizeof(vis));                if(fun(i))                {                    ans++;                }            }        }        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击