hihoCoder #1127 : 二分图二·二分图最小点覆盖和最大独立集

#1127 : 二分图二·二分图最小点覆盖和最大独立集

Time Limit:10000ms

Case Time Limit:1000ms

Memory Limit:256MB

描述

在上次安排完相亲之后又过了挺长时间,大家好像都差不多见过面了。不过相亲这个事不是说那么容易的,所以Nettle的姑姑打算收集一下之前的情况并再安排一次相亲。所以现在摆在Nettle面前的有2个问题:

1.姑姑想要了解之前所有相亲的情况。对于任一个一次相亲,只要跟参与相亲的两人交流就可以得到这次相亲的情况。如果一个人参加了多次相亲,那么跟他交流就可以知道这几次相亲的情况。那么问题来了,挖掘技术到底哪家强姑姑最少需要跟多少人进行交流可以了解到所有相亲的情况。

问题1解答

2.因为春节快要结束了,姑姑打算给这些人再安排一次集体相亲。集体相亲也就是所有人在一起相亲,不再安排一对一对的进行相亲。但是姑姑有个条件,要求所有参与相亲的人之前都没有见过。也就是说在之前的每一次相亲中的两人不会被同时邀请来参加这次集体相亲。那么问题又来了,姑姑最多可以让多少人参与这个集体相亲。

问题2解答

输入

第1行:2个正整数,N,M(N表示点数 2≤N≤1,000,M表示边数1≤M≤5,000)
第2..M+1行:每行两个整数u,v,表示一条无向边(u,v)

输出

第1行:1个整数,表示最小点覆盖数
第2行:1个整数,表示最大独立集数

Sample Input
5 4
3 2
1 3
5 4
1 5
Sample Output
2
3

解题:极大独立集与最小点覆盖互补。。。在二分图中有:最小点覆盖 = 最大匹配

 1 /*
 2 @author: Lev
 3 @date:
 4 */
 5 #include <iostream>
 6 #include <cstdio>
 7 #include <cmath>
 8 #include <cstring>
 9 #include <string>
10 #include <cstdlib>
11 #include <algorithm>
12 #include <map>
13 #include <set>
14 #include <queue>
15 #include <climits>
16 #include <deque>
17 #include <sstream>
18 #include <fstream>
19 #include <bitset>
20 #include <iomanip>
21 #define LL long long
22 #define INF 0x3f3f3f3f
23
24 using namespace std;
25 const int maxn = 10010;
26 vector<int>g[maxn];
27 int n,m,link[maxn];
28 bool used[maxn];
29 bool dfs(int u){
30     for(int i = g[u].size()-1; i >= 0; --i){
31         if(!used[g[u][i]]){
32             used[g[u][i]] = true;
33             if(link[g[u][i]] == -1 || dfs(link[g[u][i]])){
34                 link[g[u][i]] = u;
35                 link[u] = g[u][i];
36                 return true;
37             }
38         }
39     }
40     return false;
41 }
42 int main() {
43     while(~scanf("%d %d",&n,&m)) {
44         for(int i = 0; i < maxn; ++i) {
45             g[i].clear();
46             link[i] = -1;
47             used[i] = false;
48         }
49         for(int i = 0; i < m; ++i) {
50             int u,v;
51             scanf("%d %d",&u,&v);
52             g[u].push_back(v);
53             g[v].push_back(u);
54         }
55         int ans = 0;
56         for(int i = 1; i <= n; ++i)
57             if(link[i] == -1){
58                 memset(used,false,sizeof(used));
59                 ans += dfs(i);
60             }
61         printf("%d\n%d\n",ans,n-ans);
62     }
63     return 0;
64 }

时间: 2024-11-03 21:04:50

hihoCoder #1127 : 二分图二·二分图最小点覆盖和最大独立集的相关文章

hihoCoder #1127:二分图最小点覆盖和最大独立集

题目大意:求二分图最小点覆盖和最大独立集. 题目分析:如果选中一个点,那么与这个点相连的所有边都被覆盖,使所有边都被覆盖的最小点集称为最小点覆盖,它等于最大匹配:任意两个点之间都没有边相连的最大点集称为最大独立集,它等于总节点数减去最大匹配数. 代码如下: # include<iostream> # include<cstdio> # include<cmath> # include<vector> # include<list> # inclu

hihocoder 第三十四周 二分图三&#183;二分图最小点覆盖和最大独立集

题目1 : 二分图三·二分图最小点覆盖和最大独立集 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上次安排完相亲之后又过了挺长时间,大家好像都差不多见过面了.不过相亲这个事不是说那么容易的,所以Nettle的姑姑打算收集一下之前的情况并再安排一次相亲.所以现在摆在Nettle面前的有2个问题: 1.姑姑想要了解之前所有相亲的情况.对于任一个一次相亲,只要跟参与相亲的两人交流就可以得到这次相亲的情况.如果一个人参加了多次相亲,那么跟他交流就可以知道这几次相亲的情况

HDU1150 Machine Schedule(二分图最大匹配、最小点覆盖)

As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduling problems differ widely in the nature of the constraints that must be satisfied and the type of schedule desire

HihoCoder1127 二分图三&#183;二分图最小点覆盖和最大独立集

二分图三·二分图最小点覆盖和最大独立集 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上次安排完相亲之后又过了挺长时间,大家好像都差不多见过面了.不过相亲这个事不是说那么容易的,所以Nettle的姑姑打算收集一下之前的情况并再安排一次相亲.所以现在摆在Nettle面前的有2个问题: 1.姑姑想要了解之前所有相亲的情况.对于任一个一次相亲,只要跟参与相亲的两人交流就可以得到这次相亲的情况.如果一个人参加了多次相亲,那么跟他交流就可以知道这几次相亲的情况.那么问题来

hihoCoder #1122 : 二分图二?二分图最大匹配之匈牙利算法

#1122 : 二分图二•二分图最大匹配之匈牙利算法 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 上一回我们已经将所有有问题的相亲情况表剔除了,那么接下来要做的就是安排相亲了.因为过年时间并不是很长,所以姑姑希望能够尽可能在一天安排比较多的相亲.由于一个人同一天只能和一个人相亲,所以要从当前的相亲情况表里选择尽可能多的组合,且每个人不会出现两次.不知道有没有什么好办法,对于当前给定的相亲情况表,能够算出最多能同时

树的问题小结(最小生成树、次小生成树、最小树形图、LCA、最小支配集、最小点覆盖、最大独立集)

树的定义:连通无回路的无向图是一棵树. 有关树的问题: 1.最小生成树. 2.次小生成树. 3.有向图的最小树形图. 4.LCA(树上两点的最近公共祖先). 5.树的最小支配集.最小点覆盖.最大独立集. 一.最小生成树 解决的问题是:求无向图中边权值之和最小的生成树. 算法有Kruskal和Prim. Kruskal使用前向星和并查集实现,可以存储重边(平行边),时间复杂度是O(m log m  +  m),m是边的数量. Prim使用邻接矩阵建图,不可以存储重边(平行边),如果出现重边,存储的

树的最小支配集 最小点覆盖 与 最大独立集 (图论)

做 战略游戏 这道题的时候看到了这个东西,于是就来这里写了一下. 首先看一下三者的定义: 定义1 对于图G=(V,E)来说,最小支配集指的是从V中取尽量少的点组成一个集合,使得对于V中剩余的点都与取出来的点有边相连.也就是说,设V‘是图G的一个支配集,则对于图中的任意一个顶点u,要么属于集合V’,要么与V‘中的顶点相邻.在V’中出去任何元素后V‘不再是支配集,则支配集是极小支配集.称G的所有支配集中顶点个数最少的支配集为最小支配集,最小支配集中顶点的个数称为支配数. 定义2 对于图G=(V,E)

树的最小支配集,最小点覆盖,最大独立集两种算法

1.基本概念 对图G=<V,E>, 最小支配集:从V中取尽量少的点组成一个集合,使得V中剩余的点都与取出来的点有边相连 最小点覆盖:从V中取尽量少的点组成一个集合,使得E中所有边都与取出来的点相连 最大独立集:从V中取尽量多的点组成一个集合,使得这些点之间没有边相连 2.贪心法求树的最小支配集,最小点覆盖,最大独立集模板 基本算法: 以最小支配集为例,首先选择一点为根,按照深度优先遍历得到遍历序列,按照所得序列的反向序列的顺序进行贪心,对于一个既不属于支配集也不与支配集中的点相连的点来说,如果

二分图的最小点覆盖和最大独立集

一.二分图的最小点覆盖 无向图的最小点覆盖,就是选取图中最少的点使得每条边至少有一个端点被选中. 而二分图的最小点覆盖 = 最大匹配. 二.二分图的最大独立集 无向图的最大独立集,就是从无向图中选取尽量多的点,这些点两两不邻接. 而二分图的最大独立集 = 点总数 - 最大匹配. 解析见链接:http://hihocoder.com/problemset/problem/1127