HDU2063(二分图)

过山车

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 17128 Accepted Submission(s): 7478

Problem Description

RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?

Input

输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。(0小于K小于=1000)

1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。

Output

对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。

Sample Input

6 3 3

1 1

1 2

1 3

2 1

2 3

3 1

0

Sample Output

3

很裸的模版题。找最大匹配数

#include "cstring"
#include "cstdio"
#include "string.h"
#include "iostream"
using namespace std;
int uN,vN;  //u,v数目
int g[505][505];//编号是0~n-1
int linker[505];
bool used[505];
bool dfs(int u)
{
    int v;
    for(v=0;v<vN;v++)
        if(g[u][v]&&!used[v])
        {
            used[v]=true;
            if(linker[v]==-1||dfs(linker[v]))
            {
                linker[v]=u;
                return true;
            }
        }
    return false;
}
int hungary()
{
    int res=0;
    int u;
    memset(linker,-1,sizeof(linker));
    for(u=0;u<uN;u++)
    {
        memset(used,0,sizeof(used));
        if(dfs(u))  res++;
    }
    return res;
}

int main()
{
    int k;
    while(scanf("%d",&k),k)
    {
        scanf("%d%d",&uN,&vN);
        memset(g,0,sizeof(g));
        while(k--)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            g[a-1][b-1]=1;
            g[b-1][a-1]=1;
        }
        printf("%d\n",hungary());
    }

}
时间: 2024-10-17 08:53:47

HDU2063(二分图)的相关文章

HDU2063(二分图最大匹配)

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 19166    Accepted Submission(s): 8369 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做par

HDU2063 二分图最大匹配问题

匈牙利算法:http://blog.csdn.net/dark_scope/article/details/8880547 代码: #include<cstdio> #include<cstring> using namespace std; const int N = 505; bool map[N][N],used[N]; int pre[N]; int m,n,k; int find(int cur)//当前女生 { for(int i=1;i<=n;++i) { if

hdu2063 过山车 二分图最大匹配

男女进行二分图匹配,裸题 1 #include<stdio.h> 2 #include<string.h> 3 int now,head[1001],next[1001],point[1001],visit[1001],match[1001]; 4 5 void add(int x,int y){ 6 next[++now]=head[x]; 7 head[x]=now; 8 point[now]=y; 9 } 10 11 int dfs(int k) 12 { 13 for(in

hdu-2063 过山车(二分图)

Time limit1000 ms Memory limit32768 kB RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner.考虑到经费问题,boss刘

HDU2063 过山车 【二分图&#183;最大匹配】

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11477    Accepted Submission(s): 5051 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做pa

luogu3386 【模板】二分图匹配 匈牙利算法 hdu2063 过山车 dinic

luogu 匈牙利算法 #include <iostream> #include <cstring> #include <cstdio> using namespace std; int n, m, uu, vv, e, lnk[1005], ans; bool a[1005][1005], vis[1005]; bool dfs(int u){ for(int i=1; i<=m; i++){ if(a[u][i] && !vis[i]){ vi

二分图的最大匹配算法简析

有这么两个奇怪的工厂:工厂X只生产杯具,工厂Y只生产洗具 .最近,两个工厂决定将产品实行打包策略:即一个杯具搭配上一个洗具.但由于杯具和洗具的形状和功能各不相同,对于某个类别的杯具来说,只能搭配某些类型的洗具.现在,两个工厂的厂长大人想知道最多能成功的搭配多少对杯具与洗具. 类似于上面例子中提到的搭配问题,在图论中的有规范的名称:匹配.注意到,上面的例子中涉及到的物品只有两类(杯具与洗具),且问题只涉及杯具与洗具的匹配,我们把这种只涉及一种关系的匹配问题称为二分匹配问题. 现在,让我们理清一些概

HDU2063过上车【匈牙利】

大意:同学们去坐过山车,但是想要去做过山车必须是一个男同学一个女同学一起坐, 现在告诉你每个女同学想要跟那些人一起坐,问最多能有多少对同学能够坐过山车 男女同学人数都是<=500 思路: 将女同学跟其喜欢的男同学连一条边,然后求二分图的最大匹配即可. 也可以用最大流来做,将源点与女同学之间建立一个容量为1的边,将女同学与其喜欢的男同学都建立一条容量为1的边,最后将男同学与汇点建立一条容量为1的边jike,求出最大刘即可. 匈牙利算法,人数很少直接用的邻接矩阵存储的 代码: 1 #include

二分图基础知识

昨天晚上开始看二分图,到现在基本的东西学会了 我就写一下我自己的理解 首先什么是二分图 顾名思义就是能分成两个部分的图 要注意的是,‘分’的是点 并且这两个集合(这里我们称作X集合和Y集合)内部所有的点之间没有边相连,也就是说X集合中任何两点之间都不会有边相连, Y亦然 定理1:无向图G为二分图的一个冲要条件是 1.G中至少包含两个顶点  2.G中所有的回路长度都必须是偶数 接下来是一些概念: 匹配:设G=<V, E>为二分图,如果 M⊆E,并且 M 中没有任何两边有公共端点,则成M为G的一个