Code:

#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50004;
const int INF=10000000;
# define pb push_back
int N,M;
int s,t;
struct Edge{
int from,to,cap;
Edge(int u,int v,int c):from(u),to(v),cap(c) {}
};
struct Dicnic{
vector<Edge>edges;
vector<int>G[maxn];
int d[maxn],vis[maxn],cur[maxn];
queue<int>Q;
void init(){
for(int i=0;i<maxn;++i)G[i].clear();
edges.clear();
}
void addedge(int u,int v,int c){
edges.pb(Edge(u,v,c)); //正向弧
edges.pb(Edge(v,u,0)); //反向弧
int m=edges.size();
G[u].pb(m-2);
G[v].pb(m-1);
}
int BFS()
{
memset(vis,0,sizeof(vis));
d[s]=0,vis[s]=1;Q.push(s);
while(!Q.empty()){
int u=Q.front();Q.pop();
int sz=G[u].size();
for(int i=0;i<sz;++i){
Edge e=edges[G[u][i]];
if(!vis[e.to]&&e.cap>0){
d[e.to]=d[u]+1,vis[e.to]=1;
Q.push(e.to);
}
}
}
return vis[t];
}
int dfs(int x,int a){
if(x==t)return a;
int sz=G[x].size();
int f,flow=0;
for(int i=cur[x];i<sz;++i){
Edge e=edges[G[x][i]];
cur[x]=i;
if(d[e.to]==d[x]+1&&e.cap>0){
f=dfs(e.to,min(a,e.cap));
if(f)
{
int u=G[x][i];
a-=f;
edges[u].cap-=f;
edges[u^1].cap+=f;
flow+=f;
if(a==0)break;
}
}
}
return flow;
}
int maxflow(){
int ans=0;
while(BFS()){
memset(cur,0,sizeof(cur));
ans+=dfs(s,INF);
}
return ans;
}
int check(int x)
{
int siz=G[0].size();
for(int i=0;i<siz;++i)edges[G[s][i]].cap=1,edges[G[s][i]^1].cap=0;
for(int i=1;i<=M;++i)
{
int sz=G[i].size();
for(int j=0;j<sz;++j)
{
int v=edges[G[i][j]].to;
if(v!=s){
edges[G[i][j]].cap=1,edges[G[i][j]^1].cap=0;
}
}
}
for(int i=M+1;i<=N+M;++i)
{
int sz=G[i].size();
for(int j=0;j<sz;++j)
{
int v=edges[G[i][j]].to;
if(v==t){
edges[G[i][j]].cap=x,edges[G[i][j]^1].cap=0;
}
}
}
int uu=maxflow();
if(uu==M)return 1;
return 0;
}
int operate()
{
int L=0,R=12000;
int fin=0;
while(L<=R)
{
int mid=(L+R)/2;
if(check(mid)){fin=mid,R=mid-1;}
else L=mid+1;
}
return fin;
}
}op;
int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
op.init();
scanf("%d%d",&N,&M);
s=0,t=N+M+1;
for(int i=1;i<=M;++i)op.addedge(s,i,1);
for(int i=1;i<=M;++i){
int a,b;
scanf("%d%d",&a,&b);
a+=M,b+=M;
op.addedge(i,a,1);
op.addedge(i,b,1);
}
for(int i=M+1;i<=N+M;++i)op.addedge(i,t,0);
printf("%d\n",op.operate());
}
return 0;
}

  

LA3231 Fair Share 二分_网络流的更多相关文章

  1. uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。

    /** 题目: uvalive 3231 Fair Share 公平分配问题 链接:https://vjudge.net/problem/UVALive-3231 题意:有m个任务,n个处理器,每个任 ...

  2. LA 3231 - Fair Share

    You are given N processors and M jobs to be processed. Two processors are specified to each job. To ...

  3. UVALive 3231 Fair Share

    Fair Share Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Origina ...

  4. POJ 2112 Optimal Milking (二分+最短路径+网络流)

    POJ  2112 Optimal Milking (二分+最短路径+网络流) Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K To ...

  5. 【BZOJ1822】[JSOI2010]冷冻波(二分,网络流)

    [BZOJ1822][JSOI2010]冷冻波(二分,网络流) 题面 BZOJ 洛谷 题解 先预处理每个巫妖可以打到哪些小精灵,然后二分答案,网络流判定即可. #include<iostream ...

  6. 【BZOJ2756】奇怪的游戏(二分,网络流)

    [BZOJ2756]奇怪的游戏(二分,网络流) 题面 BZOJ Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blink ...

  7. BZOJ_3550_[ONTAK2010]Vacation&&BZOJ_1283:_序列_网络流解线性规划

    BZOJ_3550_[ONTAK2010]Vacation&&BZOJ_1283:_序列_网络流解线性规划 Description 给出一个长度为 的正整数序列Ci,求一个子序列,使得 ...

  8. UVA - 12264 Risk (二分,网络流)

    题意比较坑,移动完以后的士兵不能再次移动,不然样例都过不了... 最小值最大满足决策单调性所以二分答案,跑网络流验证是否可行. 这种题重点在建图,为了保证只移动一次,拆点,一个入点一个出点,到了出点的 ...

  9. POJ 2112: Optimal Milking【二分,网络流】

    题目大意:K台挤奶机,C个奶牛,每台挤奶器可以供M头牛使用,给出奶牛和和机器间的距离矩阵,求所有奶牛走最大距离的最小值 思路:最大距离的最小值,明显提示二分,将最小距离二分之后问题转化成为:K台挤奶机 ...

随机推荐

  1. iOS 内网内测应用发布

    之前测试时,iOS 开发会把测试版本上传到蒲公英上,可以很方便的获取.后来认为不安全,万一测试版泄露了会有风险,就又回到了解放前,测试跑到开发那里编包.想过把手机越狱安装开发的编的 ipa 包,这样测 ...

  2. BZOJ 4229: 选择 LCT_独创方法_边双

    考虑如果两点在一个环中,那么这两点一定可以构出双联通分量. 考虑环和环镶嵌,那么两个环中的点一定都互为双联通分量. 由此,我们想到一个算法: 将删边转为反向加边,用LCT维护图. 当我们连接两个点时, ...

  3. Python基础数据类型list,tuple

    列表是有序的可变的元素集合.列表中的每个元素可以使任何数据类型,包括列表本身. 列表生成 Python3中的列表通过定义,for循环,列表推导式等几种方式生成 定义 直接通过中括号`[]`定义一个列表 ...

  4. 小学生都能学会的python(列表[ ])

    小学生都能学会的python(列表[ ]) 1. 什么是列表(list) 能装东西的东西 列表中装的数据是没有限制的, 大小基本上是够用的 列表使用[]来表示. 在列表中每个元素与元素之间用逗号隔开 ...

  5. STM32 HAL库利用DMA实现串口不定长度接收方法

    参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...

  6. Ajax得到JSON数据

    Ajax得到JSON数据

  7. JS实现缓存运动

                                                                                                      JS ...

  8. css表格表单和统筹

    css:表格表单和统筹 学习目标 1.表单标签及属性高级 2.表格标签及属性高级 3.CSS统筹 4.BFC概念和应用场景 一.表单标签及属性高级 回顾: 表单的作用:用来收集用户的信息的; 表单的组 ...

  9. js本地对象——Date()

    Date()是JavaScript的本地对象,用于获取当前的时间,包括年.月.日.时.分.秒,可以精确到毫秒级:该对象返回的是UTC 协调世界时(Coordinated Universal Time) ...

  10. HDU 4324 Contest 3

    直接DFS即可 #include <iostream> #include <string.h> #include <algorithm> #include < ...