最大流拆点——hdu2732,poj3436
一种很普遍的做法就是把一个带有容量的点拆成两个点,一个入点一个出点,链接两个点的边的权值为这个点的容量
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的更多相关文章
- poj 3498 March of the Penguins(最大流+拆点)
题目大意:在南极生活着一些企鹅,这些企鹅站在一些冰块上,现在要让这些企鹅都跳到同一个冰块上.但是企鹅有最大的跳跃距离,每只企鹅从冰块上跳走时会给冰块造成损害,因此企鹅跳离每个冰块都有次数限制.找出企鹅 ...
- poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap
poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...
- POJ-3436 ACM Computer Factory---最大流+拆点
题目链接: https://vjudge.net/problem/POJ-3436 题目大意: 每台电脑有p个组成部分,有n个工厂加工电脑.每个工厂对于进入工厂的半成品的每个组成部分都有要求,由p个数 ...
- hdu2732 最大流+拆点
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2732 题目给定一个场景,有n*m个方格,每个方格代表一个柱子,一个柱子可以承受不同次数的跳跃,开始时图 ...
- hdu2732 Leapin' Lizards 最大流+拆点
Your platoon of wandering lizards has entered a strange room in the labyrinth you are exploring. As ...
- poj3436网络流之最大流拆点
这题看了半天看不懂题意...还是看的网上题意写的 加一个源点一个汇点,把每个点拆成两个,这两个点的流量是v,其他联通的边都设为无穷大 输入没有1的点就与源点连接,输出只有1的点就与汇点连接 还有这个输 ...
- hdu4289 最小割最大流 (拆点最大流)
最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...
- BZOJ-1877 晨跑 最小费用最大流+拆点
其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...
- BZOJ-1070 修车 最小费用最大流+拆点+略坑建图
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...
随机推荐
- C#跨线程访问(二)----thread参数、回调传参数
一.单个参数(封箱也可实现多参数) class B { public static void Main() { Thread t = new Thread(ne ...
- linux 两个进程通过 共享内存 通信例子
例子1:两个进程通过共享内存通信,一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据 文件1 创建进程1,实现功能,打印共享内存中的数据 #include <stdio.h> # ...
- visual studio 2013下搭建 安卓,ios,wp app开发平台
1.安装 visual studio 2013 + Microsoft Visual Studio 2013 Update 4+Microsoft Build Tools 2015 2.安装java ...
- layerui ios不适应问题
.admin-main {-webkit-overflow-scrolling: touch; overflow: scroll; position: absolute; left: 0; top: ...
- vue cli3 vue.config配置
跳地址:https://cli.vuejs.org/zh/config/#publicpath
- NX二次开发-UFUN输入表达式名称,获取它的名称和值UF_MODL_ask_exp
NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建一个新的表达式,有TAG tag_t ...
- npm run 同时执行多个命令
在项目中可能需要一套代码同时部署几套环境,每一次改动就需要同时打包N次.这时就需要能够一个命令同时打包多次,省去了很多麻烦. 这里我们需要用到 concurrently 这个 npm 包,能够实现我们 ...
- 在jsp页面直接读取mysql数据库显示数据
闲来无事,学学java,虽说编程语言相通,但是接触一门新知识还是有些疑惑,边学边记录,方便以后温故. 直接给出代码: <%@page import="java.sql.ResultSe ...
- Linux下同一目录内文件和目录为什么不能同名?
问题描述: 如果事先有叫‘A’的文件夹存在,则不允许建立叫‘A’的文件: 同理若先有叫‘b’的文件存在,一样不允许建立叫‘b’的文件夹. 原因很简单,因为Linux下一切都是文件,一个目录归根到底还是 ...
- java 传入多个参数时报"Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1,..." 解决方案
@Select("SELECT id FROM ae_post ORDER BY id DESC LIMIT #{page},#{size}") List<Post> ...