最大流拆点——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] ...
随机推荐
- es6注意点
补救方法: 详情:http://es6.ruanyifeng.com/#docs/array 取出文本内容 实现深拷贝 jq实现不完全深拷贝 jQuery.extend = jQuery.fn.ext ...
- 【ZJOI2007】捉迷藏
题面 Description Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子. 某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏. 他们的家很大且构造很奇特,由N个屋子和N-1条 ...
- 25. object类中的一些方法分析
1. Object java是面向对象语言,所以其核心思想: 找合适的对象,做合适的事 Object是所有类的终极基类.任何一个类都继承了Object类 2. Object的部分函数列表 1)Stri ...
- 请问在一个固定div大小里面,图片右移动,超出div容器的图片给隐藏,怎么设定?
如图,让图片移动,溢出的图片被隐藏,怎么设置? overflow: hidden;
- Android Studio Download
{ https://developer.android.google.cn/studio }
- Delphi 中多线程同步的一些处理方法
Delphi 中多线程同步的一些处理方法 当创建了多个线程,并且多个线程都要访问同一资源,,就有可能出现混乱,于是用Synchronize来控制,使同一时间只有一个线程使用那部分资源,Synchr ...
- 高危预警| SQL数据库成主要攻击对象,或引发新一轮大规模勒索
近日,阿里云安全团队发现,目前互联网上的服务器,SQL数据库仍然有不少处于直接暴露在公网的状态,且数量有上升趋势.黑客可以利用数据库存在的漏洞或弱口令直接获取数据,并植入勒索和挖矿病毒寻求牟利.阿里云 ...
- mysql数据库名有 横杠 横线 - dash 怎么办
'''SELECT date FROM `%s` ORDER BY date DESC LIMIT 1''' % 'ZXS-QZCSCRB-3' 重点就是这个符号 ` 键盘左上角
- C++之运算符重载(一元)
一.-符号重载 1.成员函数重载负号 2.友元函数重载负号 3.补充说明 <1> <一元运算符编码实现(一)>课程笔记: A:事实上,我们的重载运算符返回void.返回对象本身 ...
- Delphi中的Sender:TObject对象解析转载
https://blog.csdn.net/jl_tiny/article/details/24376661 Delphi中的Sender:TObject对象解析 procedure TForm1.B ...