http://poj.org/problem?id=2195

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
#define inf 0x3f3f3f3f
using namespace std;
int n,m,s,t,tt;
struct pointe
{
int x,y;
} l[],r[];
struct node
{
int x,y,c,w;
int next;
} eg[];
char map[][];
int head[],v[],dis[],pre[];
void init()
{
memset(head,-,sizeof(head));
tt=;
s=;
t=n*m+;
}
void add(int xx,int yy,int cc,int ww)
{
eg[tt].x=xx;
eg[tt].y=yy;
eg[tt].c=cc;
eg[tt].w=ww;
eg[tt].next=head[xx];
head[xx]=tt++;
eg[tt].x=yy;
eg[tt].y=xx;
eg[tt].c=;
eg[tt].w=-ww;
eg[tt].next=head[yy];
head[yy]=tt++;
}
int spfa(int s,int t)
{
for(int i=s; i<=t; i++)
{
v[i]=;
pre[i]=-;
dis[i]=inf;
}
queue<int>q;
dis[s]=;
q.push(s);
while(!q.empty())
{
int ff=q.front();
q.pop();
v[ff]=;
//今天算是刚了解邻接边表第一次更新的是与源点相邻的第一层
//例如head[10]->1,3,5,7....;
for(int i=head[ff]; i!=-; i=eg[i].next)
{
int w1=eg[i].y;
if(eg[i].c&&dis[w1]>dis[ff]+eg[i].w)
{
dis[w1]=dis[ff]+eg[i].w;//注意这里dis[ff]
pre[w1]=i;//算是了解么意思了
if(!v[w1])
{
v[w1]=;
q.push(w1);
}
}
}
}
if(dis[t]==inf)
{
return ;
}
return ;
}
void KM(int s,int t)
{
int ans=,minx;
while(spfa(s,t)==)
{
minx=inf;
for(int i=pre[t]; i!=-; i=pre[eg[i].x])
minx=min(minx,eg[i].c);
for(int i=pre[t]; i!=-; i=pre[eg[i].x])
{
eg[i].c-=minx;
eg[i+].c+=minx;
}
ans+=minx*dis[t];
}
cout<<ans<<endl;
return ;
}
int main()
{
int t1,t2,temp;
while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
{
t1=t2=;
init();
for(int i=; i<=n; i++)
scanf("%*c%s",map[i]+);
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
temp=(i-)*m+j;
if(map[i][j]=='m')
{
add(s,temp,,);
l[t1].x=i;
l[t1++].y=j;
}
else if(map[i][j]=='H')
{
add(temp,t,,);
r[t2].x=i;
r[t2++].y=j;
}
}
}
for(int i=; i<t1; i++)
{
int l1=(l[i].x-)*m+l[i].y;
for(int j=; j<t2; j++)
{
int l2=(r[j].x-)*m+r[j].y;
int l3=abs(l[i].x-r[j].x)+abs(l[i].y-r[j].y);
add(l1,l2,,l3);
}
}
KM(s,t);
}
return ;
}
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
#include <math.h>
#define inf 0x3f3f3f3f
using namespace std;
struct node1//记录h或者m的坐标
{
int x,y;
} a[],b[];
struct node
{
int x,y,c,w;
int next;
} eg[];
int n,m,tt,head[],v[],dis[],pre[],s,t;
char map[][];
void init()
{
tt=;
memset(head,-,sizeof(head));
s=;
t=n*m+;
}
void add(int xx,int yy,int cc,int ww)
{
eg[tt].x=xx;
eg[tt].y=yy;
eg[tt].c=cc;
eg[tt].w=ww;
eg[tt].next=head[xx];
head[xx]=tt++;
eg[tt].x=yy;
eg[tt].y=xx;
eg[tt].c=;
eg[tt].w=-ww;
eg[tt].next=head[yy];
head[yy]=tt++;
}
int spfa(int s,int t)
{
queue<int>q;
for(int i=; i<=t; i++)
{
v[i]=;
dis[i]=inf;
pre[i]=-;
}
v[s]=;
dis[s]=;
q.push(s);
while(!q.empty())
{
int ff=q.front();
q.pop();
v[ff]=;
for(int i=head[ff]; i!=-; i=eg[i].next)
{
int w1=eg[i].y;
if(eg[i].c&&dis[w1]>dis[ff]+eg[i].w)
{
dis[w1]=dis[ff]+eg[i].w;
pre[w1]=i;//用边表建图存储其信息
if(!v[w1])
{
v[w1]=;
q.push(w1);
}
}
}
}
if(dis[t]==inf)
{
return ;
}
return ;
}
void KM(int s,int t)
{
int min1,ans=;
while(spfa(s,t)==)
{
min1=inf;
for(int i=pre[t]; i!=-; i=pre[eg[i].x])
{
if(min1>=eg[i].c)
{
min1=eg[i].c;
}
}
for(int i=pre[t]; i!=-; i=pre[eg[i].x])
{
eg[i].c-=min1;
eg[i+].c+=min1;
}
ans+=min1*dis[t];
}
printf("%d\n",ans);
return ;
}
int main()
{
int t1,t2;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==) break;
init();
t1=;
t2=;
for(int i=; i<=n; i++)
{
scanf("%s",map[i]+);//因为要创建超级源点,所以从一比较好计算
for(int j=; j<=m; j++)
{
int l=(i-)*m+j;//以点建图
if(map[i][j]=='m')
{
add(s,l,,);
a[t1].x=i;
a[t1++].y=j;
}
else if(map[i][j]=='H')
{
add(l,t,,);
b[t2].x=i;
b[t2++].y=j;
}
}
}
for(int i=; i<t1; i++)
{
int l1=(a[i].x-)*m+a[i].y;//以点建图
for(int j=; j<t2; j++)
{
int l2=abs(a[i].x-b[j].x)+abs(a[i].y-b[j].y);
int l3=(b[j].x-)*m+b[j].y;//以点建图
add(l1,l3,,l2);
}
}
KM(s,t);
}
return ;
}

POJ2195:Going Home(费用流入门)的更多相关文章

  1. POJ2195 Going Home[费用流|二分图最大权匹配]

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22088   Accepted: 11155 Desc ...

  2. 使用Guava RateLimiter限流入门到深入

    前言 在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流 缓存: 缓存的目的是提升系统访问速度和增大系统处理容量 降级: 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问 ...

  3. JavaIo流入门篇之字节流基本使用。

    一 基本知识了解(  字节流, 字符流, byte,bit是啥?) /* java中字节流和字符流之前有接触过,但是一直没有深入的学习和了解. 今天带着几个问题,简单的使用字节流的基本操作. 1 什么 ...

  4. Java-io流入门到精通详细总结

    IO流:★★★★★,用于处理设备上数据. 流:可以理解数据的流动,就是一个数据流.IO流最终要以对象来体现,对象都存在IO包中. 流也进行分类: 1:输入流(读)和输出流(写). 2:因为处理的数据不 ...

  5. IO流入门-第十三章-File相关

    /* java.io.File 1.File和流无关,不能通过该类完成文件的读写 2.File是文件和目录路径名的抽象变现形式. */ import java.io.*; public class F ...

  6. IO流入门-第十二章-ObjectInputStream_ObjectOutputStream

    DataInputStream和DataOutputStream基本用法和方法示例,序列化和反序列化 import java.io.Serializable; //该接口是一个“可序列化”的 ,没有任 ...

  7. IO流入门-第十一章-PrintStream_PrintWriter

    DataInputStream和DataOutputStream基本用法和方法示例 /* java.io.PrintStream:标准的输出流,默认打印到控制台,以字节方式 java.io.Print ...

  8. IO流入门-第十章-DataInputStream_DataOutputStream

    DataInputStream和DataOutputStream基本用法和方法示例 /* java.io.DataOutputStream 数据字节输出流,带着类型写入 可以将内存中的“int i = ...

  9. IO流入门-第九章-BufferedReader_BufferedWriter复制

    利用BufferedReader和BufferedWriter进行复制粘贴 import java.io.*; public class BufferedReader_BufferedWriterCo ...

随机推荐

  1. Eclipse的调试功能的10个小窍门

    你可能已经看过一些类似“关于调试的N件事”的文章了.但我想我每天大概在调试上会花掉1个小时,这是非常多的时间了.所以非常值得我们来了解一些用得到的功能,可以帮我们节约很多时间.所以在这个主题上值得我再 ...

  2. 提高Web性能的前端优化技巧总结

  3. Maven配置默认使用的JDK版本

    问题: 创建maven项目的时候,jdk版本是1.7版本,而自己安装的是1.8版本,从而导致无法使用lambda等Java8新特性. 每次右键项目名-maven->update project ...

  4. oracle_存储过程_没有参数_根据配置自动创建申请单以及写日志事务回滚

    CREATE OR REPLACE PROCEDURE A_MEAS_MIINSP_PLAN_CREATEASvs_msg VARCHAR2(4000);p_PERIODTYPE number; -- ...

  5. jquery获取父级元素、子级元素、兄弟元素的方法

    jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(&q ...

  6. 阿里大于短信返回XML

    返回异常和成功的两种不同,XML返回直接拿alibaba_aliqin_fc_sms_num_send_response判断节点是否有这个名字 官方API地址: https://api.alidayu ...

  7. C/C++程序编译流程

    单个文件的编译过程 多个文件的编译过程

  8. 【BZOJ1045】[HAOI2008] 糖果传递 贪心

    [BZOJ1045][HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正 ...

  9. mysql如何按周统计数据?

    转自:https://www.cnblogs.com/wanghetao/p/3920124.html MySql 按周/月/日统计数据的方法 知识关键词:DATE_FORMAT  select DA ...

  10. 关于Visual Studio 20**自动添加头部注释信息

    作为一个万年潜水党,不管这一篇文章技术含量如何,也算是一个好的开始吧.   在日常的开发中我们经常需要为类库添加注释和版权等信息,这样我们就需要每次去拷贝粘贴同样的文字,为了减少这种重复性的工作,我们 ...