HDU 2063 过山车+poj 1469

//这是一个非常简单的匹配。其实满感觉这种算法讲道理是可以想到。
//但是我们这种弱就只能先学了匈牙利算法,然后随便嗨这种题目了。没事结果都一样。

//这就是匹配算法的DFS形式,有一个BFS形式的,说是适用于稀疏二分图,但是时间复杂度还是(n*m)。。。
//也不是很懂DFS和BFS版有什么差,但是真的有差别,那就上HK算法了,时间复杂度(sqrt(n)*m);

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
#include <queue>
#include <stack>
using namespace std;
#define INF 0x3f3f3f
#define pi acos(-1.0)
#define LL long long
#define N 550

int ma[N][N];
int cx[N],cy[N];
int vis[N];
int k,m,n;


int fuck(int u)
{
    for(int i=1; i<=m; i++)
    {
        if(!vis[i]&&ma[u][i])
        {
            vis[i]=1;
            if(cy[i]==-1||fuck(cy[i]))
            {
                cy[i]=u;
                return 1;
            }
        }
    }
    return 0;
}


int main()
{
    while(~scanf("%d",&k)&&k)
    {
        int a,b;
        scanf("%d%d",&n,&m);
        memset(ma,0,sizeof(ma));
        for(int i=0; i<k; i++)
        {
            scanf("%d%d",&a,&b);
            ma[a][b]=1;
        }
        memset(cy,-1,sizeof(cy));


        int ans=0;
        for(int i=1; i<=n; i++)
        {
            memset(vis,0,sizeof(vis));
            if(fuck(i))
            {
                ans++;
            }
        }
        printf("%d
",ans);
    }
    return 0;
}

poj1469
题意:p门课,n个人,问你能不能刚好匹配;

#include<cstdio>
#include<string.h>
#include<iostream>
using namespace std;
typedef long long LL;
#define N 300
int nx,ny;
int bmap[N][N];
bool bmask[N];
int cx[N];
int cy[N];
int p,n;

int findpath(int u)
{
    int i;
    for(int i=1;i<=n;i++)
    {
        if(bmap[u][i]&&!bmask[i])
        {
            bmask[i]=1;
            if(cy[i]==-1||findpath(cy[i]))
            {
                cy[i]=u;
                cx[u]=i;
                return 1;
            }
        }
    }
    return 0;
}

int Maxmatch()
{
    int res=0;
    int i,j;
    memset(cx,-1,sizeof(cx));
    memset(cy,-1,sizeof(cy));
    for(i=1;i<=p;i++)
    {
        if(cx[i]==-1)
        {
            memset(bmask,0,sizeof(bmask));
            res+=findpath(i);
        }
    }
    return res;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&p,&n);
        int m;
        memset(bmap,0,sizeof(bmap));
        for(int i=1;i<=p;i++)
        {
            int num,k;
            scanf("%d",&num);
            for(int j=1;j<=num;j++)
            {
                scanf("%d",&k);
                bmap[i][k]=1;
            }
        }
        int ans=Maxmatch();
        if(ans==p)
            printf("YES
");
        else
            printf("NO
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934538.html