【网络流-二分图最大匹配】poj3041Asteroids

/*
这道题将每行x看成是结点x,没列y看成是结点y,而障碍物的坐标xy看成是从x到y的
一条边。建图后问题就变成了,找最少的点,使得这些点与所有的边相邻,即最小
点覆盖,用匈牙利算法解决。
-------------------------------
定理:最小点覆盖数 = 最大匹配数,即求图的最大匹配即可,匈牙利算法
-------------------------------
模板讲解:
bool find(int v)
{
    for(int i=1; i<=n; i++)
    {
        if(g[v][i] && !vis[i])如果结点i和v相邻并且未被查找过
        {
            vis[i] = true;标记结点i为已查找过
            if(link[i] == 0 || find(link[i]))link[i] == 0表示i不再前一个匹配M中||i在匹配M中,但是从与i相邻的节点出发可以有增广路
            {
                link[i] = v;记录查找成功记录
                return true;返回查找成功
            }
        }
    }
    return false;
}
-------------------------------
匈牙利算法介绍:
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于
Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找
增广路径,它是一种用增广路径求二分图最大匹配的算法。
---------------------------------
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 0x3f3f3f3f

using namespace std;

int n,k,r,c;
int g[550][550];
bool vis[10010];
int link[10010];

bool find(int v)
{
    for(int i=1; i<=n; i++)
    {
        if(g[v][i] && !vis[i])
        {
            vis[i] = true;
            if(link[i] == 0 || find(link[i]))
            {
                link[i] = v;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    //freopen("input.txt","r",stdin);
    int ans;
    while(scanf("%d%d",&n,&k) != EOF)
    {
        memset(g,0,sizeof(g));
        memset(link,0,sizeof(link));
        for(int i = 0; i < k; i++)
        {
            scanf("%d%d",&r,&c);
            g[r][c] = 1;
        }
        ans = 0;
        for(int i=1; i<=n; i++)
        {
            memset(vis,0,sizeof(vis));//清空上次搜索时的标记
            if(find(i))//从节点i尝试扩展
                ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

---------------------------------------------------------------------

战斗,毫不退缩;奋斗,永不停歇~~~~~~~~~~

【网络流-二分图最大匹配】poj3041Asteroids,布布扣,bubuko.com

时间: 2024-11-18 23:21:29

【网络流-二分图最大匹配】poj3041Asteroids的相关文章

【8.16校内测试】【队列】【数学】【网络流/二分图最大匹配】

在一个队列中一次加入每一个字符,每次更新当前队列中的状态,当满足存在26个不同字符时,更新答案,删除队首. 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 #define RG register 6 using namespace std; 7 8 char s[2000005]; 9 int len, nex[2000005], flag[30]

【网络流#6】POJ 3041 Asteroids 二分图最大匹配 - 《挑战程序设计竞赛》例题

学习网络流中ing...作为初学者练习是不可少的~~~构图方法因为书上很详细了,所以就简单说一说 把光束作为图的顶点,小行星当做连接顶点的边,建图,由于 最小顶点覆盖 等于 二分图最大匹配 ,因此求二分图最大匹配即可. 邻接矩阵,DFS寻找增广路,匈牙利算法 邻接矩阵:复杂度O(n^3) 如果使用邻接表:复杂度O(n*m) #include<cstdio> #include<cstring> #include<cmath> #include<iostream>

图论——LCA、强联通分量、桥、割顶、二分图最大匹配、网络流

A: 交通运输线 时间限制: 5 Sec  内存限制: 128 MB 题目描述 战后有很多城市被严重破坏,我们需要重建城市.然而,有些建设材料只能在某些地方产生.因此,我们必须通过城市交通,来运送这些材料的城市.由于大部分道路已经在战争期间完全遭到破坏,可能有两个城市之间没有道路.当然在运输线中,更不可能存在圈. 现在,你的任务来了.给你战后的道路情况,我们想知道,两个城市之间是否存在道路,如果存在,输出这两个城市之间的最短路径长度. 输入 第一行一个整数Case(Case<=10)表示测试数据

二分图最大匹配[网络流]

题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 输出格式: 共一行,二分图最大匹配 建模: s--1-->X--1-->Y--1-->t 注意:边的数量 PS:本题比hungary快了5倍 // // main.cpp // 二分图dinic // // Created by Candy on 29/11/2016. // Copyri

网络流之二分图最大匹配

前言:二分图最大匹配往往用于普通的指派问题中,可转换为最大流问题求解,也可以利用二分图的性质及其边的容量为1的特点,简单的实现二分图的最大匹配算法. 问题模型:有n台计算机和k个任务,每台计算机处理的任务种类不同,问如果给每台计算机分配一个任务,一次最多能处理多少个任务. 分析:该问题可以转化为图论模型来分析.设U为所有计算机顶点的集合,V为所有任务类型的集合,u属于U,v属于V,e=(u,v)表示计算机u能处理任务v,E是所有e的集合. 则G=(U||V, E),且G中满足两两不含公共端点的边

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

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

Codevs1232飞行员配对方案问题【二分图最大匹配】

Codevs上的Special Judge似乎挂了 所以就跑到COGS上交 http://cojs.tk/cogs/problem/problem.php?pid=14 14. [网络流24题] 搭配飞行员 ★★☆   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题

51Nod 2006 飞行员配对(二分图最大匹配)-匈牙利算法

2006 飞行员配对(二分图最大匹配) 题目来源: 网络流24题 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的

UOJ #78 二分图最大匹配

#78. 二分图最大匹配 从前一个和谐的班级,有 nl 个是男生,有 nr 个是女生.编号分别为 1,…,nl 和 1,…,nr. 有若干个这样的条件:第 v 个男生和第 u 个女生愿意结为配偶. 请问这个班级里最多产生多少对配偶? 输入格式 第一行三个正整数,nl,nr,m. 接下来 m 行,每行两个整数 v,u 表示第 v 个男生和第 u 个女生愿意结为配偶.保证 1≤v≤nl,1≤u≤nr,保证同一个条件不会出现两次. 输出格式 第一行一个整数,表示最多产生多少对配偶. 接下来一行 nl