ural 1109,NYOJ 239,匈牙利算法邻接表

NYOJ 239:http://acm.nyist.net/JudgeOnline/problem.php?pid=239

ural 1109 :http://acm.timus.ru/problem.aspx?space=1&num=1109

NYOJ 月老的难题,是裸的最大匹配,很烦的是邻接阵超时。改用邻接表。

#include <bits/stdc++.h>
using namespace std;
#define maxn 1005

vector <int> G[maxn];
bool use[maxn];
int match[maxn];
int m,n,k;

bool dfs(int u)
{
    for(int i=0;i<G[u].size();i++)
    {
        if(use[G[u][i]]==false)
        {
            use[G[u][i]] = true;
            if(match[G[u][i]]==-1||dfs(match[G[u][i]]))
            {
                match[G[u][i]] = u;
                return true;
            }
        }
    }
    return false;
}

int main()
{

    scanf("%d%d%d",&m,&n,&k);
    for(int i=0;i<k;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        G[u].push_back(v);
    }
    memset(match,-1,sizeof(match));
    int ans = 0;
    for(int i=1;i<=m;i++)
    {
        memset(use,0,sizeof(use));
        if(dfs(i))
            ans ++;
    }
    printf("%d\n",ans);
    //printf("%d\n",m+n-ans);
    return 0;
}

然后是ural,最小路径覆盖。

题意:

A国家有M个代表,B国有N个代表,其中有K对代表可以进行谈判(一个是A国的,一个是B国的),并且每一个代表至少被包含在其中一对中(也就是说,每个 人可以至少找到另外一个人谈判),每一对谈判需要一对电话联系(一对电话联系数目算1),现在使每个人都能进行电话联系的最少联系数目。

就是求最少对数。每个点都要有边相连,这样的边最少是多少——最小路径覆盖。

首先求一下最大匹配(都是一对一),可能还有没有匹配的人,加上这些人,如案例: 最大匹配2,还有左边2号没有匹配。加上这个人。

得公式:

最小路径覆盖 = n+ m - 2 * ans + ans;

#include <bits/stdc++.h>
using namespace std;
#define maxn 1005

vector <int> G[maxn];
bool use[maxn];
int match[maxn];
int m,n,k;

bool dfs(int u)
{
    for(int i=0;i<G[u].size();i++)
    {
        if(use[G[u][i]]==false)
        {
            use[G[u][i]] = true;
            if(match[G[u][i]]==-1||dfs(match[G[u][i]]))
            {
                match[G[u][i]] = u;
                return true;
            }
        }
    }
    return false;
}

int main()
{

    scanf("%d%d%d",&m,&n,&k);
    for(int i=0;i<k;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        G[u].push_back(v);
    }
    memset(match,-1,sizeof(match));
    int ans = 0;
    for(int i=1;i<=m;i++)
    {
        memset(use,0,sizeof(use));
        if(dfs(i))
            ans ++;
    }
    printf("%d\n",m+n-ans);
    return 0;
}

时间: 2024-10-27 06:16:44

ural 1109,NYOJ 239,匈牙利算法邻接表的相关文章

nyoj 239 月老的难题【匈牙利算法+邻接表】

月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭. 现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸福的家庭,月老准备促成尽可能多的幸福家庭,请你帮他找出最多可能促成的幸福家庭数量吧. 假设男孩们分别编号为1~n,女孩们也分别编号为1~n. 输入 第一行是一个整数T,表示测试数据的组数(1<=T<=400)每组测

The Postal Worker Rings Once(UVA 117)最短路径—SPFA算法+邻接表

The Postal Worker Rings Once From:UVA, 117 Time Limit: 3000 MS Background Graph algorithms form a very important part of computer science and have a lineage that goes back at least to Euler and the famous Seven Bridges of K?nigsberg problem. Many opt

二分图最大匹配|UOJ#78|匈牙利算法|边表|Elena

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

poj1273--Drainage Ditches(最大流Edmond-Karp算法 邻接表实现)

最大流模板题 大部分Edmond-Karp算法代码都是邻接矩阵实现,试着改成了邻接表. #include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; // 裸最大流 const int N = 2005; const int M = 2005; const int INF = 0x7fffffff; // 邻接表 struct Ed

ZSTU OJ 3999 零基础学算法---邻接表

题目:Click here 题意:我就喜欢中文题! 分析:这个题虽然是中文题,但是还是有一点费解的.其实就是给你一棵树,是用图的形式给你的,只知道a,b之间有一条边,并不知道谁是父,谁是子.思路就是先把这个无向图用邻接表存下来,再转成有向图,最后dfs回答每一条询问.(的确有点麻烦,并且这次使用vector实现的邻接表,学长教的有点难懂,近期更新上来) 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&

哈理工oj Touring (最短路 dij算法 邻接表 + 队列 )

Touring Time Limit: 1000 MS Memory Limit: 32767 K Total Submit: 257(46 users) Total Accepted: 108(39 users) Rating: Special Judge: No Description The best friends Mr. Li and Mr. Liu are touring in beautiful country M. M has n cities and m two-way roa

二分图最大匹配---匈牙利算法BFS 实现

二分图指的是这样一种图,其所有顶点可以分成两个集合X和Y,其中X或Y中任意两个在同一集合中的点都不相连,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y.给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不依附于同一个顶点,则称M是一个匹配.图中包含边数最多的匹配称为图的最大匹配. 二分图的最大匹配有两种求法,第一种是最大流:第二种就是我现在要讲的匈牙利算法.这个算法说白了就是最大流的算法,但是它跟据二分图匹配这个问题的特点,把最大流算法做了简化,提高了效率. 增

邻接表实现Dijkstra算法以及DFS与BFS算法

//============================================================================ // Name : ListDijkstra.cpp // Author : fffff // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //==========================

POJ 2387 Til the Cows Come Home dijkstra算法 用邻接表和邻接矩阵

题目如下: Til the Cows Come Home Time Limit: 1000MS        Memory Limit: 65536K Total Submissions: 27726        Accepted: 9353 Description Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wa