[POI2005]KOS-Dicing (最大流+二分)lg3425
题面https://www.luogu.org/problemnew/show/P3425
题面说赢的最多的人最少赢几场,肯定是向二分的方向思考
建立源点向每一场比赛连容量为1的边,从每场比赛向参赛两个人各连一条容量为1的边,表示一场比赛有一个人赢
二分一个最多的人赢的场数,从每个人向汇点连容量为mid的边,若最大流等于场数,说明符合题意,可以减小最多的人赢的场数,反之缩小
因为要输出方案,可以记录下满足条件的最小答案,然后以这个答案再跑一次,从比赛流向个人的边如果容量为0(也就是在增广时被流过了)说明他赢了这场比赛
#include<bits/stdc++.h>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
inline int read(){
int w=,f=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
w=(w<<)+(w<<)+ch-;
ch=getchar();
}
return w*f;
}
int n,m,cnt=-,head[],cur[],depth[],S,T,u[],v[],ans,x[],y[];
const int p=;
bool vis[];
struct Edge{
int from,to,next,flow;
}edge[];
inline void addedge(int u,int v,int w){
cnt++;
edge[cnt].from=u;
edge[cnt].to=v;
edge[cnt].flow=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
inline void ins(int u,int v,int w){
addedge(u,v,w);addedge(v,u,);
}
queue<int> q;
inline bool bfs(int st,int ed){
memset(depth,,sizeof(depth));
int u,v,i,j,k;q.push(st);depth[st]=;
for(i=S;i<=T;i++)cur[i]=head[i];
while(!q.empty()){
u=q.front();q.pop();
for(i=head[u];i!=-;i=edge[i].next){
v=edge[i].to;
if(!depth[v]&&edge[i].flow){
depth[v]=depth[u]+;q.push(v);
}
}
}
return depth[ed];
}
inline int dfs(int u,int ed,int limit){
if(!limit||u==ed) return limit;
int v,i,j,k;int flow=,f;
for(i=cur[u];i!=-;i=edge[i].next){
v=edge[i].to;cur[u]=i;
if(depth[v]==depth[u]+&&(f=dfs(v,ed,min(limit,edge[i].flow)))){
limit-=f;flow+=f;
edge[i].flow-=f;edge[i^].flow+=f;
if(!limit) break;
}
}
return flow;
}
inline void Dinic(){
while(bfs(S,T)){
ans+=dfs(S,T,INF);
}
}
inline bool check(int mid){
cnt=-;memset(head,-,sizeof(head));
int i,j,k;
for(i=;i<=m;i++){
ins(S,i,);
ins(i,x[i]+p,);
ins(i,y[i]+p,);
}
for(i=;i<=n;i++){
ins(i+p,T,mid);
}
ans=;Dinic();
return ans==m;
}
int main(){
n=read();m=read();int i,j,k;int ans1;
memset(head,-,sizeof(head));S=;T=;
for(i=;i<=m;i++){
x[i]=read();y[i]=read();
}
int l=,r=m+;
while(l<=r){
int mid=(l+r)>>;
if(check(mid)) r=mid-,ans1=mid;
else l=mid+;
}
cout<<ans1<<endl;
check(ans1);
for(int u=;u<=m;u++){
for(i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;v-=p;if(v< or edge[i].flow) continue;
if(v==x[u]) vis[u]=true;
}
}
for(i=;i<=m;i++){
printf("%d\n",vis[i]);
}
return ;
}
[POI2005]KOS-Dicing (最大流+二分)lg3425的更多相关文章
- HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)
HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...
- Risk UVA - 12264 拆点法+最大流+二分 最少流量的节点流量尽量多。
/** 题目:Risk UVA - 12264 链接:https://vjudge.net/problem/UVA-12264 题意:给n个点的无权无向图(n<=100),每个点有一个非负数ai ...
- BZOJ-3130 费用流 (听题目胡扯丶裸最大流) 二分判定+最大流+实数精度乱搞
DCrusher爷喜欢A我做的水题,没办法,只能A他做不动的题了.... 3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec ...
- BZOJ-1305 dance跳舞 建图+最大流+二分判定
跟随YveH的脚步又做了道网络流...%%% 1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 2119 S ...
- poj 2112 floyd+Dinic最大流+二分最小值
题目大意是: K台挤奶机器,C头牛,K不超过30,C不超过200,每台挤奶机器最多可以为M台牛工作,给出这些牛和机器之间,牛和牛之间,机器与机器之间的距离,在保证让最多的牛都有机器挤奶的情况下,给出其 ...
- hdu 3228 (最大流+二分)
题意:一共有N个城市,一些城市里有金矿,一些城市里有仓库,金矿和仓库都有一个容量,有M条边,每条边是双向的,有一个权值,求将所有金矿里的储量都运送到仓库中,所需要经过的道路中,使最大的权值最小 思路: ...
- BZOJ2406矩阵——有上下界的可行流+二分答案
题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...
- bzoj 3597 [Scoi2014] 方伯伯运椰子 - 费用流 - 二分答案
题目传送门 传送门 题目大意 给定一个费用流,每条边有一个初始流量$c_i$和单位流量费用$d_i$,增加一条边的1单位的流量需要花费$b_i$的代价而减少一条边的1单位的流量需要花费$a_i$的代价 ...
- BZOJ4669抢夺(费用流+二分答案)
题目描述 大战将至, 美国决定实行计划经济.美国西部总共有 N 个城市,编号 为 0 ∼ N − 1,以及 M 条道路,道路是单向的.其中城市 0 是一个大城 市,里面住着 K 个人,而城市 N − ...
随机推荐
- Python 爬取必应壁纸
import re import os import requests from time import sleep headers = { "User-Agent": (&quo ...
- java 上传文件到七牛云中
import com.alibaba.fastjson.JSONObject;import com.qiniu.common.QiniuException;import com.qiniu.commo ...
- 并查集find,merge操作
一.find操作 //find操作路径压缩版 inline int find(int x){ if(fa[x]==x) return x; int t=find(fa[x]); fa[x]=t; re ...
- 流程图GGEditor 之 自定义节点相关属性
自定义节点 注册 -- registerNode 我们通过以下接口往 G6 全局注册节点: // 注册节点 G6.registerNode(name, { // 绘制 draw(item) { r ...
- [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)
oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...
- C++\CLI使用.net委托,*Callback注意"this"
今天在使用c++\cli的时候遇到了点关于委托,callback使用的问题,简单记录一下 首先贴段简单的C#中使用System.Threading.Timer的代码. Timer GameTim ...
- webpack安装jQuery报错
使用webpack搭建项目,并使用了node下载了jQuery使用,使用命令行完成构建时发现报错了, ERROR in ./node_modules/jquery/lib/node-jquery.js ...
- sc 与 net 命令
查看命令的帮助: help sc 或者 help net net: net start mysql 打开服务 net stop mysql 关闭服务 net pause mysql 暂停服务 sc ...
- Console对象与错误处理机制
console的常见用途有两个. 调试程序,显示网页代码运行时的错误信息. 提供了一个命令行接口,用来与网页代码互动. console对象的浏览器实现,包含在浏览器自带的开发工具之中.按 F12 打开 ...
- [HNOI2009]图的同构记数
题意 在所以置换下,本质不同的\(n\)阶图个数 做法 可以假想成\(K_n\),边有黑白两色,黑边存在于原图,白边存在于补图 由于\(n\le 60\),可以手算出拆分数不大,所以我们爆搜置换群 对 ...