FOJ 2232 匈牙利算法找二分图最大匹配

题目链接

简单理解匈牙利算法

简单理解二分图

尽量让每一个随从击败一个对手且随从全部存活,关键是为每一个随从找对手(递归过程),"腾"。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int used[110];
int g[110][110];  //建立随从和对手的对战关系
int ee[110];
int n;
struct people{
    int live;
    int attack;
}man[110],enemy[110];
bool find(int j) {
    for(int k=1;k<=n;k++) {
        if(g[j][k] && used[k]==0) {
            used[k]=1;
            if(ee[k]==0 || find(ee[k])) {
                    ee[k]=j;
                    return true;
            }
        }
    }
    return false;
}

int main() {
    int test,all;
    scanf("%d",&test);
    while(test--) {
        cin>>n;
        all=0;
        memset(ee,0,sizeof(ee));
        memset(g,0,sizeof(g));
        for(int i=1;i<=n;i++) {
            scanf("%d%d",&man[i].live,&man[i].attack);
        }
        for(int i=1;i<=n;i++) {
            scanf("%d%d",&enemy[i].live,&enemy[i].attack);
        }
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=n;j++) {
                g[i][j]=man[i].attack>=enemy[j].live&&man[i].live>enemy[j].attack;
            }
        }
        int flag=1;
        for(int i=1;i<=n;i++) {
            memset(used,0,sizeof(used));
            if(!find(i)) {
                flag=0;
                break;
            }
        }
        if(flag==1) {
            printf("Yes\n");
        }
        else {
            printf("No\n");
        }
    }
    return 0;
} 
时间: 2024-12-25 23:36:48

FOJ 2232 匈牙利算法找二分图最大匹配的相关文章

51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左边的点和没用过的右边的点连起来, 如果遇到一个点已经连过就试着把原来的拆掉 把现在这条线连起来看能不能多连上一条线. 总结来说就是试和拆,试的过程很简单,拆的过程由于使用递归写的,很复杂.很难讲清楚,只能看代码自己理会. 代码(有注释): #include <bits\stdc++.h> usin

Hungary(匈牙利算法)——二分图最大匹配

在复习匈牙利算法的时候,发现这么一篇介绍匈牙利算法的文章,非常通俗易懂,所以就借鉴过来了. 复杂度:邻接矩阵:O(v^3)邻接表:O(V*E) 附上链接:趣写算法系列之--匈牙利算法 下面就附上代码吧: int maxn;//maxn 为x.y集合的最大顶点数 int xmatch[maxn]; //xmatch[i]表示X集合中的i在Y集合中对应的匹配 int ymatch[maxn]; //ymatch[i]表示Y集合中的i在X集合中对应的匹配 int map[maxn][maxn]; //

匈牙利算法解决二分图匹配

匈牙利算法解决二分图匹配 [书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程] 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. -------等等,看得头大?那么请看下面的版本: 通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可

用匈牙利算法求二分图的最大匹配

转载大神的!! 什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到.二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识):第二种就是我现在要讲的匈牙利算法.这个算法说白了就是最大流的算法,但是它跟据二分图匹配这个问题的特点,把最大流算法做了简化,提高了效率.匈牙利算法其实很简单,但是网上搜不到什么说得清楚的文章.所以我决定要写一下. 最大流算法的核心问题就是找增广路径(augment path).匈牙利算法也不例外,它的基本模式就是: 初始时最大匹

匈牙利算法求二分图求最大匹配

无向图匈牙利算法求地的值除以2才是答案,因为每个边都匹配了两次,有向图算法得出的就是答案. #include<iostream> #include<cstdio> #include<cstring> using namespace std; int maps[50][50],match[50],vis[50],n; bool Find(int u) { cout<<"the fa = "<<u<<endl; for

匈牙利算法(二分图)

                                                                                                            ---------------------------------------------------------------------题材大多来自网络,本篇由神犇整理 基本概念—二分图 二分图:是图论中的一种特殊模型.若能将无向图G=(V,E)的顶点V划分为两个交集为空的顶点集,

二分图&amp;&amp;匈牙利算法(二分图基本算法)

二分图 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 区别二分图,关键是看点集是否能分成两个独立的点集.如下图所示 二分图的最大匹配 给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配. 选择这样的边数最大的子集称为图的最大匹配问题(maxim

匈牙利算法求二分图的最大匹配数

给定一个二分图,其中左半部包含n1n1个点(编号1~n1n1),右半部包含n2n2个点(编号1~n2n2),二分图共包含m条边. 数据保证任意一条边的两个端点都不可能在同一部分中. 请你求出二分图的最大匹配数. 二分图的匹配:给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配. 二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数. 输入格式 第一行包含三个整数 n1n1. n2n2 和 mm. 接下

poj3020 Antenna Placement 匈牙利算法求最小覆盖=最大匹配数(自身对应自身情况下要对半) 小圈圈圈点

/** 题目:poj3020 Antenna Placement 链接:http://poj.org/problem?id=3020 题意: 给一个由'*'或者'o'组成的n*m大小的图,你可以用一个小圈圈圈住两个相邻的'*',问要圈住所有的'*'最少需要多少个小圈圈.(小圈圈可以相交) 思路: 先尽量圈出能圈两个且不重复圈的'*'.剩下的没有圈的'*'一定需要用一个. 所以构造二分图,求最大匹配,结果:ans = 总的'*'数量-最大匹配数*2 + 最大匹配数 = 总的'*'数量-最大匹配数: