一种很普遍的做法就是把一个带有容量的点拆成两个点,一个入点一个出点,链接两个点的边的权值为这个点的容量

hdu3732

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<string>
#include<iostream>
#define INF 1e9
using namespace std;
const int maxn =+; struct Edge
{
int from,to,cap,flow;
Edge(){}
Edge(int f,int t,int c,int fl):from(f),to(t),cap(c),flow(fl){}
}; struct Dinic
{
int n,m,s,t;
vector<Edge> edges;
vector<int> G[maxn];
int cur[maxn];
int d[maxn];
bool vis[maxn]; void init(int n,int s,int t)
{
this->n=n, this->s=s, this->t=t;
edges.clear();
for(int i=;i<n;i++) G[i].clear();
} void AddEdge(int from,int to,int cap)
{
edges.push_back( Edge(from,to,cap,) );
edges.push_back( Edge(to,from,,) );
m = edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
} bool BFS()
{
queue<int> Q;
Q.push(s);
memset(vis,,sizeof(vis));
d[s]=;
vis[s]=true;
while(!Q.empty())
{
int x=Q.front(); Q.pop();
for(int i=;i<G[x].size();++i)
{
Edge& e=edges[G[x][i]];
if(!vis[e.to] && e.cap>e.flow)
{
d[e.to]=+d[x];
vis[e.to]=true;
Q.push(e.to);
}
}
}
return vis[t];
} int DFS(int x,int a)
{
if(x==t || a==) return a;
int flow=,f;
for(int& i=cur[x];i<G[x].size();++i)
{
Edge& e=edges[G[x][i]];
if(d[e.to]==d[x]+ && (f=DFS(e.to,min(a,e.cap-e.flow) ) )>)
{
e.flow +=f;
edges[G[x][i]^].flow -=f;
flow +=f;
a-=f;
if(a==) break;
}
}
return flow;
} int max_flow()
{
int ans=;
while(BFS())
{
memset(cur,,sizeof(cur));
ans += DFS(s,INF);
}
return ans;
}
}DC; int main()
{
int T; scanf("%d",&T);
for(int kase=;kase<=T;++kase)
{
int n,m,d,src,dst;
int sum=;//蜥蜴数
scanf("%d%d",&n,&d);
for(int i=;i<=n;i++)
{
string s;
cin>>s;
if(i==)//第一次
{
m = s.size();
src=, dst=*n*m+;
DC.init(*n*m+,src,dst);
}
for(int j=;j<s.size();++j)if(s[j]-''>)
{
int id = (i-)*m+j+;//当前点编号
DC.AddEdge(id, id+n*m, s[j]-'');
if(i<=d || i+d>n || j<d || j+d>=m)//当前格子能直接跳出棋盘
{
DC.AddEdge(id+n*m,dst,INF);
}
else //不能直接跳出去
{
for(int k=;k<=n;k++)
for(int h=;h<m;h++)
{
int id2= (k-)*m+h+;
if(id==id2) continue;
if(abs(i-k)+abs(j-h)<= d) DC.AddEdge(id+n*m,id2,INF);
}
}
}
}
for(int i=;i<=n;++i)
{
string s;
cin>>s;
for(int j=;j<s.size();++j)
{
int id = (i-)*m+j+;//当前点编号
if(s[j]=='L')
{
++sum;
DC.AddEdge(src,id,);
}
}
}
int ans = sum-DC.max_flow();
if(ans==) printf("Case #%d: no lizard was left behind.\n",kase);
else if(ans==) printf("Case #%d: 1 lizard was left behind.\n",kase);
else printf("Case #%d: %d lizards were left behind.\n",kase,ans);
}
return ;
}

poj3436

#include<cstdio>
#include<iostream>
#include<cstring>
#define Maxn 110
using namespace std; const int inf=0x3f3f3f3f;
struct line{
int to,next,cap;
}p[Maxn*Maxn*];
int head[Maxn];
int q[Maxn];
int d[Maxn];
int cur[Maxn];
int tot;
int src,t;
int n,m;
void addedge(int a,int b,int c){
p[tot].to=b;
p[tot].next=head[a];
p[tot].cap=c;
head[a]=tot++;
}
void insert(int a,int b,int c){
addedge(a,b,c);
addedge(b,a,);
}
bool bfs(){
memset(d,-,sizeof d);
int s=,e=-;
q[++e]=src;
d[src]=;
while(s<=e){
int u=q[s++];
for(int i=head[u];i!=-;i=p[i].next){
int v=p[i].to;
if(d[v]==-&&p[i].cap){
d[v]=d[u]+;
q[++e]=v;
}
}
}
return d[t]!=-;
}
int dfs(int u,int alpha){
if(u==t) return alpha;
int w,used=;
for(int i=cur[u];i!=-&&used<alpha;i=p[i].next){
int v=p[i].to;
if(p[i].cap&&d[v]==d[u]+){
w=dfs(v,min(alpha-used,p[i].cap));
used+=w;
p[i].cap-=w;
p[i^].cap+=w;
cur[u]=i;
}
}
if(!used) d[u]=-;
return used;
}
int dinic(){
int ans=;
src=,t=*m+;
while(bfs()){
for(int i=src;i<=t;i++) cur[i]=head[i];
ans+=dfs(src,inf);
}
return ans;
}
int num[Maxn];
int input[Maxn][],output[Maxn][];
int vis[Maxn][Maxn];
bool check(int x,int y){
return x==y||y==;
}
bool ck1(int d){ //没有1
for(int i=;i<n;i++)
if(input[d][i]==) return false;
return true;
}
bool ck2(int d){ //全1
for(int i=;i<n;i++)
if(output[d][i]!=) return false;
return true;
}
int main()
{
while(~scanf("%d%d",&n,&m)){
for(int i=;i<=m;i++){
scanf("%d",num+i);
for(int j=;j<n;j++)
scanf("%d",&input[i][j]);
for(int j=;j<n;j++)
scanf("%d",&output[i][j]);
}
memset(head,-,sizeof head);
memset(vis,,sizeof vis);
tot=;
for(int i=;i<=m;i++)
for(int j=;j<=m;j++){
if(i==j) continue;
bool flag=true;
for(int k=;k<n;k++)
if(!check(output[i][k],input[j][k])){
flag=false;
break;
}
if(flag){
insert(i+m,j,num[i]);
vis[i+m][j]=;
}
}
for(int i=;i<=m;i++){
insert(i,i+m,num[i]); //拆点
if(ck1(i)) insert(,i,num[i]);
if(ck2(i)) insert(i+m,*m+,num[i]);
}
printf("%d",dinic());
int cnt=;
for(int i=;i<=m;i++){
for(int j=head[i+m];j!=-;j=p[j].next)
if(vis[i+m][p[j].to]&&p[j].cap<num[i]) cnt++;
}
printf(" %d\n",cnt);
for(int i=;i<=m;i++){
for(int j=head[i+m];j!=-;j=p[j].next)
if(vis[i+m][p[j].to]&&p[j].cap<num[i]){
printf("%d %d %d\n",i,p[j].to,num[i]-p[j].cap);
}
}
}
return ;
}

最大流拆点——hdu2732,poj3436的更多相关文章

  1. poj 3498 March of the Penguins(最大流+拆点)

    题目大意:在南极生活着一些企鹅,这些企鹅站在一些冰块上,现在要让这些企鹅都跳到同一个冰块上.但是企鹅有最大的跳跃距离,每只企鹅从冰块上跳走时会给冰块造成损害,因此企鹅跳离每个冰块都有次数限制.找出企鹅 ...

  2. poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap

    poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...

  3. POJ-3436 ACM Computer Factory---最大流+拆点

    题目链接: https://vjudge.net/problem/POJ-3436 题目大意: 每台电脑有p个组成部分,有n个工厂加工电脑.每个工厂对于进入工厂的半成品的每个组成部分都有要求,由p个数 ...

  4. hdu2732 最大流+拆点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2732 题目给定一个场景,有n*m个方格,每个方格代表一个柱子,一个柱子可以承受不同次数的跳跃,开始时图 ...

  5. hdu2732 Leapin' Lizards 最大流+拆点

    Your platoon of wandering lizards has entered a strange room in the labyrinth you are exploring. As ...

  6. poj3436网络流之最大流拆点

    这题看了半天看不懂题意...还是看的网上题意写的 加一个源点一个汇点,把每个点拆成两个,这两个点的流量是v,其他联通的边都设为无穷大 输入没有1的点就与源点连接,输出只有1的点就与汇点连接 还有这个输 ...

  7. hdu4289 最小割最大流 (拆点最大流)

    最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...

  8. BZOJ-1877 晨跑 最小费用最大流+拆点

    其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...

  9. BZOJ-1070 修车 最小费用最大流+拆点+略坑建图

    1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...

随机推荐

  1. spring_入门配置和注入

    Spring的获取容器: public static void main(String[] args) { //获取核心容器 BeanFactory延迟加载对象 ApplicationContext ...

  2. mongodb java操作常用写法

    MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成.MongoDB 文档类似于 JSON 对象.字段值可以包含其他文档,数组及文档数组.下面介绍的是用java操作 ...

  3. day01 python起源 介绍 解释器 变量 流程控制if

    day01 python   一.python的起源     1.python简介     java 企业级应用, android, app     c 操作系统, 做开发语言的, 游戏的内核     ...

  4. Spring Boot 2.X 实现文件上传(三)

    使用 SpringBoot 项目完成单个.多个文件的上传处理,并将上传的文件保存到指定目录下. 代码演示案例 所有的 HTML 页面文件 index.html <!DOCTYPE html> ...

  5. HttpUrlConnection类基本使用

    这个类用来模拟浏览器向服务器发送请求和接收响应 注意: HttpUrlConnection对象简称huc对象 1)获取huc对象向url构造中传递url字符串,并调用openconnection方法即 ...

  6. leetcode-685-冗余连接②

    题目描述: 参考后提交:并查集: class Solution: def findRedundantDirectedConnection(self, edges: List[List[int]]) - ...

  7. ul -- li 模拟select下拉框

    在写项目中 用到下拉框,一般用 <select name="" id=""> <option value=</option> &l ...

  8. linux安装MySQL-5.6.22-1.el6.i686.rpm-bundle.tar

    1.首先搜索系统有没有安装过mysql,使用命令 rpm -qa|grep mysql 有的话先卸载 rpm -e --nodeps  + mysql应用名字\ 2.在/usr/local下创建mys ...

  9. cdh maven仓库地址

    常用的maven仓库地址: 中央库:http://repo.maven.apache.org/maven2/ cdh库:https://repository.cloudera.com/artifact ...

  10. Invalid bound statement (not found): com.my.demo.mapper.UserMapper.getAll

    网上的方法全试了,配置全对,很奇怪. 最后一查,竟然忘记把mapper保存为xml格式. 记录一下.