[HihoCoder1393]网络流三·二分图多重匹配

题目大意:

班级有N名学生,运动会有M项不同的比赛,第i项比赛每个班需要派出m_i名选手参加,编号为i的学生最多同时参加给定的b_i项比赛中的任意a_i项比赛。
根据统计的结果,想知道能否有一个合适的安排,同时满足这些条件。

思路:

最大流求二分图多重匹配。
建立超级源点S、超级汇点T。
对于每一个学生i,连一条从S到i的容量为a_i的边。
对于每一项比赛i,连一条从i到T的容量为m_i的边。
对于每一个学生i和其所擅长的所有比赛j,连一条从i到j的容量为1的边。
计算最大流F,当F=Σm_i时,条件满足。

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<vector>
 4 #include<queue>
 5 #include<cstring>
 6 inline int getint() {
 7     char ch;
 8     while(!isdigit(ch=getchar()));
 9     int x=ch^‘0‘;
10     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^‘0‘);
11     return x;
12 }
13 struct Edge {
14     int from,to,remain;
15 };
16 const int E=10200,V=202,inf=0x7fffffff;
17 Edge e[E<<1];
18 int sz;
19 std::vector<int> g[V];
20 inline void add_edge(const int u,const int v,const int w) {
21     e[sz]=(Edge){u,v,w};
22     g[u].push_back(sz);
23     sz++;
24 }
25 int s,t;
26 void reset() {
27     sz=0;
28     for(int i=0;i<V;i++) g[i].clear();
29 }
30 int a[V],p[V];
31 inline int Augment() {
32     std::queue<int> q;
33     q.push(s);
34     memset(a,0,sizeof a);
35     a[s]=inf;
36     while(!q.empty()&&!a[t]) {
37         int x=q.front();
38         q.pop();
39         for(unsigned i=0;i<g[x].size();i++) {
40             Edge &y=e[g[x][i]];
41             if(!a[y.to]&&y.remain) {
42                 p[y.to]=g[x][i];
43                 a[y.to]=std::min(a[x],y.remain);
44                 q.push(y.to);
45             }
46         }
47     }
48     return a[t];
49 }
50 inline int EdmondsKarp() {
51     int maxflow=0;
52     while(int flow=Augment()) {
53         for(int i=t;i!=s;i=e[p[i]].from) {
54             e[p[i]].remain-=flow;
55             e[p[i]^1].remain+=flow;
56         }
57         maxflow+=flow;
58     }
59     return maxflow;
60 }
61 int main() {
62     for(int T=getint();T;T--) {
63         reset();
64         int n=getint(),m=getint();
65         s=0,t=n+m+1;
66         int sum=0;
67         for(int i=1;i<=m;i++) {
68             int w=getint();
69             sum+=w;
70             add_edge(n+i,t,w);
71             add_edge(t,n+i,0);
72         }
73         for(int i=1;i<=n;i++) {
74             int a=getint(),b=getint();
75             add_edge(s,i,a);
76             add_edge(i,s,0);
77             while(b--) {
78                 int v=getint();
79                 add_edge(i,n+v,1);
80                 add_edge(n+v,i,0);
81             }
82         }
83         puts(EdmondsKarp()==sum?"Yes":"No");
84     }
85     return 0;
86 }
时间: 2024-10-07 16:40:36

[HihoCoder1393]网络流三·二分图多重匹配的相关文章

hihoCoder 1393 网络流三&#183;二分图多重匹配(Dinic求二分图最大多重匹配)

#1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上. 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N. 运动会一共有M项不同的比赛,编号为1..M.第i项比赛每个班需要派出m[i]名选手参加. 根据小Hi和小Ho的统计,编号为i的学生表示最多同时参加

hihoCoder 1393 网络流三&#183;二分图多重匹配 (网络流学习#3 记录)

题目链接:http://hihocoder.com/problemset/problem/1393 话说我之前一直不知道二分匹配可以用网络流做... #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=205; struct ss{ int v,c,nxt; } e[N*20]; int head[N],tot,vis[N],n,m,a[N],b[N],s

[HIHO1393]网络流三&#183;二分图多重匹配

题目链接:http://hihocoder.com/problemset/problem/1393 把项目到汇点的边权值都加起来,跑完最大流后看是否最大流=权值和.如果等于权值和说明所有项目都有足够的人参与. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef struct Edge { 5 int u, v, w, next; 6 }Edge; 7 const int inf = 0x7f7f7f7f; 8 const

poj 3614 Sunscreen 网络流或二分图多重匹配或优先队列

题意: 有C头牛,每头牛有它可以接受的药的最小值和最大值,有L瓶药,每瓶药有一个值u和它最多能给v头牛用,求最多有多少头牛能满足. 分析: 网络流或二分图多重匹配或优先队列,这道题优化了我的dinic模板,原来的模板会TLE... 代码: //poj 3614 //sep9 #include <iostream> #include <queue> #include <algorithm> using namespace std; const int maxN=5005;

hiho 第117周 二分图多重匹配,网络流解决

描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上. 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N. 运动会一共有M项不同的比赛,编号为1..M.第i项比赛每个班需要派出m[i]名选手参加. 根据小Hi和小Ho的统计,编号为i的学生表示最多同时参加a[i]项比赛,并且给出他所擅长的b[i]项比赛的编号. 小Hi和小Ho希望将每个学生都安排到他所擅长的比赛项目,

POJ3189_Steady Cow Assignment(二分图多重匹配/网络流)

解题报告 http://blog.csdn.net/juncoder/article/details/38340447 题目传送门 题意: B个猪圈,N头猪,每头猪对每个猪圈有一个满意值,要求安排这些猪使得最大满意和最小满意的猪差值最小 思路: 二分图的多重匹配问题; 猪圈和源点连边,容量为猪圈容量,猪与汇点连边,容量1; 猪圈和猪之间连线取决所取的满意值范围; 二分查找满意值最小差值的范围. #include <iostream> #include <cstring> #incl

网络流24题 第五题 - PowerOJ1740 CodeVS1905 圆桌问题 二分图多重匹配 网络最大流

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - PowerOJ1740 - 有SPJ - 推荐 题目传送门 - CodeVS1905 - 无SPJ - 0% 通过率(可以用来看题目) 题意概括 有n支队伍,m个组.第i支队伍有a[i]个人,第i个组最多可以有b[i]个人. 现在要求任何两个同队队员不可位于同一组,求是否有方案满足. 输出第一行,表示是否有,如果有,是1,没有的话,输出0: 如果有,接下来n行,第i行a[i]个数,表示第i支队伍的每个人被安

Jamie&#39;s Contact Groups(二分图多重匹配+二分)(网络流)

Jamie's Contact Groups Time Limit:7000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2289 Description Jamie is a very popular girl and has quite a lot of friends, so she always keeps a very long contact list

Optimal Milking(二分图多重匹配+二分)(网络流)

Optimal Milking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2112 Description FJ has moved his K (1 <= K <= 30) milking machines out into the cow pastures among the C (1 <= C <= 20