poj1274_二分匹配_静态邻接表

贴一下板子。。。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 using namespace std;
 7
 8 #define MAX 202
 9 bool flag, visit[MAX];
10 int match[MAX];
11 int cow, stall;
12 int head[MAX];
13
14 struct edge {
15     int to, next;
16 } e[MAX*MAX];
17 int index_;
18
19 void addedge(int u, int v) {
20     e[index_].to = v;
21     e[index_].next = head[u];
22     head[u] = index_;
23     index_++;
24 }
25
26 bool dfs(int u) {
27     int v;
28     for(int i=head[u]; i!=0; i=e[i].next) {
29         v = e[i].to;
30         if(!visit[v]) {
31             visit[v] = true;
32             if(match[v]==-1 || dfs(match[v])) {
33                 match[v] = u;
34                 return true;
35             }
36         }
37     }
38     return false;
39 }
40
41 int MaxMatch() {
42     int sum = 0;
43     memset(match, -1, sizeof(match));
44     for(int i=1; i<=cow; i++) {
45         memset(visit, false, sizeof(visit));
46         if(dfs(i)) sum++;
47     }
48     return sum;
49 }
50 int main() {
51     freopen("test.txt", "r", stdin);
52     int k, ans, m;
53     while(scanf("%d %d", &cow, &stall) != EOF) {
54         memset(head, 0, sizeof(head));
55         index_ = 1;
56         for(int i=1; i<=cow; i++) {
57             scanf("%d", &k);
58             for(int j=0; j<k; j++) {
59                 scanf("%d", &m);
60                 addedge(i, m);
61             }
62         }
63         ans = MaxMatch();
64         printf("%d\n", ans);
65     }
66     return 0;
67 }

时间: 2024-10-09 04:11:15

poj1274_二分匹配_静态邻接表的相关文章

静态邻接表

用于保存每个点出发的边. (转)csdn     http://blog.csdn.net/yrhsilence/article/details/5978019[cpp] view plaincopy #include <iostream> #include <queue> using namespace std; const long edge_maxn = 1005;  //边的最大上限 const long point_maxn = 105;  //点的最大上限 struct

Asteroids(二分匹配_最小点覆盖)

Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice points of the

hdu 1498 50 years, 50 colors(二分匹配_匈牙利算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1498 50 years, 50 colors Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1918    Accepted Submission(s): 1058 Problem Description On Octorber 21st,

看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)

查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 静态查找表:只查找,而不进行插入,删除. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素. 静态表的 查找 大致 四种 算法: 线性查找,二分查找,斐波那契查找和插值查找. 其中 在线性查找之前,对表 无要求.对于 其余三种 需要 在查找之前 排序.插值查找 除了 需要 排序,还需要 均匀分布. 下面 给出代码: 线性查

HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可以工作的最长时间和一个可以完成的任务的难度的最大值, 一台机器能完成一个任务的条件是这台机器的最长工作时间和能完成任务的难度值必须都大于等于这个任务,而且一台机器最多完成一个任务,假设一个任务的时间为t,难度值为x,那么完成这个任务可以赚到的钱 money = 500 * t + 2 * x; 现在

STL_稀疏图,树_使用vector邻接表存储

本文出自:http://blog.csdn.net/svitter 分析:vector是STL模板中的容器.可以利用其性质来构建邻接表. 定义: #include <vector> #define MAXN 10000 //max n of a tree or graph //if is a tree, n / 2 is OK ; using namespace std; typedef vector<int> vint; vector <vint> G(MAXN);

hdu 4185 Oil Skimming(二分匹配)

Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 883    Accepted Submission(s): 374 Problem Description Thanks to a certain "green" resources company, there is a new profitable

二分+二分匹配

给了一个矩阵 n行m列 选n个数 要保证这n个数不在同行同列,计算出第k大的数最小 , 二分答案,然后我们对于每个a[i][j]<=mid的我们就i和j建立一条边 然后二分求最大匹配必须大于等于n-k-1(因为是第k大 而不是第k小 坑了好久才发现) #include <algorithm> #include <stdio.h> #include <string.h> #include <vector> #include <iostream>

hdu 4169 二分匹配最大独立集 ***

题意:有水平N张牌,竖直M张牌,同一方向的牌不会相交.水平的和垂直的可能会相交,求最少踢出去几张牌使剩下的牌都不相交. 二分匹配 最小点覆盖=最大匹配. 链接:点我 坐标点作为匹配的端点 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #incl