HDU 1083 Coures(二分图匹配)

解题思路:

裸的匈牙利算法,看最大匹配是否等于P;

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 500;
int p, n;
int G[MAXN][MAXN];
int match[MAXN];
int vis[MAXN];
int path(int u)
{
    for(int i=1;i<=p;i++)
    {
        if(G[u][i] && !vis[i])
        {
            vis[i] = 1;
            if(match[i] == -1 || path(match[i]))
            {
                match[i] = u;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        memset(G, 0, sizeof(G));
        memset(vis, 0, sizeof(vis));
        memset(match, -1, sizeof(match));
        scanf("%d%d", &p, &n);
        int c;
        for(int i=1;i<=p;i++)
        {
            scanf("%d", &c);
            while(c--)
            {
                int x;
                scanf("%d", &x);
                G[x][i] = 1;
            }
        }
        int ans = 0;
        for(int i=1;i<=n;i++)
        {
            memset(vis, 0, sizeof(vis));
            ans += path(i);
        }
        if(ans == p) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
时间: 2024-11-06 20:32:00

HDU 1083 Coures(二分图匹配)的相关文章

hdu 1083 Courses(二分图匹配)

Courses Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4278    Accepted Submission(s): 2036 Problem Description Consider a group of N students and P courses. Each student visits zero, one or

MZL&#39;s City (hdu 5352 最小费用流 ||二分图匹配)

MZL's City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 719    Accepted Submission(s): 251 Problem Description MZL is an active girl who has her own country. Her big country has N cities num

hdu 5727 Necklace 二分图匹配

题目链接 给2*n个珠子, n<=9, n个阴n个阳. 然后将它们弄成一个环, 阴阳交替.现在给你m个关系, 每个关系给出a, b. 如果阳a和阴b挨着, 那么a就会变暗. 问你最小变暗几个阳. 我们求出阴的所有全排列, 是9!, 因为形成一个环. 所以可以想象成一个珠子是固定不变的, 剩下n-1个变, 所以就是8!. 然后对于每种情况, 就是我们熟悉的二分图匹配了. 对于两个阴珠之间的空隙, 如果阳珠可以放到这里就连一条边. 然后跑匈牙利匹配就可以了. 9!过不了... #include <

A - Fire Net - hdu 1045(二分图匹配)

题意:一个阵地可以向四周扫射,求出来最多能修多少个阵地,墙不可以被扫射透,阵地不能同行或者或者列(有墙隔着例外) 分析:很久以前就做过这道题..当时是练习深搜来着,不过时间复杂度比较高,现在再看突然发现原来可以用二分图匹配来做,时间soso的 ****************************************************************** #include<stdio.h>#include<string.h>#include<algorit

E - Swap - hdu 2819(简单二分图匹配)

题意:如果可以交换行列,问主对角线能不能全为1 分析:要想主对角线全为1很明显要有N个行列不想同的点就行了,可以用二分图匹配计算出来多能有几个.如果小与N就不能.输出要是对的就行,不必和答案一样 ************************************************************************ #include<stdio.h>#include<algorithm>#include<string.h>using namesp

D - 棋盘游戏 - HDU 1281(二分图匹配)

分析:先求出来最大匹配数,然后用匹配的点一个一个去除看看能否达到最大匹配,能的话就是关键点(很暴力啊),不过竟然才31ms ***************************************************************** #include<stdio.h>#include<string.h>#include<algorithm>using namespace std; const int MAXN = 105; bool G[MAXN]

F - Rain on your Parade - hdu 2389(二分图匹配,Hk算法)

题意:给一些人和一些伞的坐标,然后每个人都有一定的速度,还有多少时间就会下雨,问最多能有多少人可以拿到伞. 分析:题意很明确,可以用每个人和伞判断一下是否能够达到,如果能就建立一个联系.不过这道题的数据还是挺大的,第一次使用的匈牙利算法果断的TLE了,然后就百度了一下发现有一个 Hopcroft-Karp算法 不过这个算法网上描述的很少,而且都说的比较含糊不清,不过幸好搜到一个比较不错的课件,看了一上午总算有些明白怎么回事,以前是寻找一个增广路,这个是寻找所有的增广路,并且使用BFS进行分层,看

G - Oil Skimming - hdu 4185(二分图匹配)

题意:在大海里有一些石油 ‘#’表示石油, ‘.’表示水,有个人有一个工具可以回收这些石油,不过只能回收1*2大小的石油块,里面不能含有海水,要不就没办法使用了,求出来最多能回收多少块石油 分析:先把数据处理一下,给每一点石油都进行编号,然后查找一下四周联合是否能组成石油块,能的话就连接,因为一点有可能即在左边又在右边,所以最后的结果应该除去 2 ************************************************************************* #

HDU 6346 整数规划 二分图匹配最优解

整数规划 在xi 与 yi 之间建立一条边值为a[i][j]的边, 然后跑km算法 2分图最优匹配. 原来的km+hunger跑法T了, 拿了一个新的板子, 新的写法是将这原来的找新的最小的d放在了上一次的残留图上,从而减小复杂度, 但是个人还不是很理解为什么最小的d下一次出现的位置一定是这次出现的位置的对应的x的点. 复杂度:n3 代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 con