[HihoCoder1393]网络流三·二分图多重匹配
2017-07-28 16:53
169 查看
题目大意:
班级有$N$名学生,运动会有$M$项不同的比赛,第$i$项比赛每个班需要派出$m_i$名选手参加,编号为i的学生最多同时参加给定的$b_i$项比赛中的任意$a_i$项比赛。
根据统计的结果,想知道能否有一个合适的安排,同时满足这些条件。
思路:
最大流求二分图多重匹配。
建立超级源点$S$、超级汇点$T$。
对于每一个学生$s_i$,连一条从$S$到$s_i$的容量为$a_i$的边。
对于每一项比赛$c_i$,连一条从$c_i$到$T$的容量为$m_i$的边。
对于每一个学生$s_i$和其所擅长的所有比赛$c_j$,连一条从$s_i$到$c_j$的容量为1的边。
计算最大流$F$,当$F=Σm_i$时,条件满足。
#include<cstdio> #include<cctype> #include<vector> #include<queue> #include<cstring> inline int getint() { char ch; while(!isdigit(ch=getchar())); int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x; } struct Edge { int from,to,remain; }; const int E=10200,V=202,inf=0x7fffffff; Edge e[E<<1]; int sz; std::vector<int> g[V]; inline void add_edge(const int u,const int v,const int w) { e[sz]=(Edge){u,v,w}; g[u].push_back(sz); sz++; } int s,t; void reset() { sz=0; for(int i=0;i<V;i++) g[i].clear(); } int a[V],p[V]; inline int Augment() { std::queue<int> q; q.push(s); memset(a,0,sizeof a); a[s]=inf; while(!q.empty()&&!a[t]) { int x=q.front(); q.pop(); for(unsigned i=0;i<g[x].size();i++) { Edge &y=e[g[x][i]]; if(!a[y.to]&&y.remain) { p[y.to]=g[x][i]; a[y.to]=std::min(a[x],y.remain); q.push(y.to); } } } return a[t]; } inline int EdmondsKarp() { int maxflow=0; while(int flow=Augment()) { for(int i=t;i!=s;i=e[p[i]].from) { e[p[i]].remain-=flow; e[p[i]^1].remain+=flow; } maxflow+=flow; } return maxflow; } int main() { for(int T=getint();T;T--) { reset(); int n=getint(),m=getint(); s=0,t=n+m+1; int sum=0; for(int i=1;i<=m;i++) { int w=getint(); sum+=w; add_edge(n+i,t,w); add_edge(t,n+i,0); } for(int i=1;i<=n;i++) { int a=getint(),b=getint(); add_edge(s,i,a); add_edge(i,s,0); while(b--) { int v=getint(); add_edge(i,n+v,1); add_edge(n+v,i,0); } } puts(EdmondsKarp()==sum?"Yes":"No"); } return 0; }
相关文章推荐
- hihocoder-1393 二分图的多重匹配(网络流做法)
- hihoCoder 1393 网络流三·二分图多重匹配 (网络流学习#3 记录)
- [HIHO1393]网络流三·二分图多重匹配
- 网络流三·二分图多重匹配 HihoCoder - 1393
- HihoCoder 1393 二分图多重匹配 Dinic
- LOJ6003 「网络流 24 题 - 4」 魔术球 坠小路径覆盖数 二分图坠大匹配
- CJOJ 1494 【网络流24题】 搭配飞行员(二分图最大匹配)
- POJ3041 二分图最大匹配(网络流算法)
- HDU 5352——MZL's City——————【二分图多重匹配、拆点||网络流||费用流】
- hiho 第117周 二分图多重匹配,网络流解决
- [网络流24题] 飞行员配对方案问题 最大流 二分图最大匹配
- 【题解】新型城市化 HAOI2017 网络流 二分图最大匹配 强连通分量
- 网络流24题(07)试题库问题(二分图多重匹配 + 最大流)
- HDU 3605 Escape(网络流 + 状压简化 | 二分图多重匹配)
- poj 3614 Sunscreen 网络流或二分图多重匹配或优先队列
- POJ3614 优先队列+贪心or二分图最大匹配(网络流)
- 【网络流】基础二分图的最大匹配问题
- LOJ6000 「网络流 24 题 - 1」 飞行员配对 二分图坠大匹配
- loj6000 「网络流 24 题」搭配飞行员(二分图最大匹配)
- 【网络流二十四题 圆桌聚餐】【二分图多重匹配->最大流】