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. VC++ ToolTip的简单使用

    1.在基于对话框的MFC应用程序中使用Tooltip,首先在Dlg类的头文件中定义一个变量: CToolTipCtrl m_iToolTips; 2.在Dlg类的OnInitDialog中添加代码: ...

  2. jQuery弹出层效果

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  3. shell中判断一个变量是否为0或者为某个具体的值

    需求说明: 在实际写脚本的过程中,需要判断某个变量的值是否为某个数字, 比如,判断某个进程的数量是否为0用来确定进程是否存在,这样的情况. 简单来说,算术比较. 测试过程: 通过以下的脚本来判断mys ...

  4. mysql数据库中查看某个视图的定义的SQL语句

    环境描述: mysql版本:5.5.57-log 操作系统版本:Red Hat Enterprise Linux Server release 6.6 (Santiago) 需求描述: 查看某个视图的 ...

  5. shell基础篇(三)--引号

    ---今天篇幅比较少:只介绍引号. shell中的引号有三种:双引号",单引号',反引号`1. 双引号:由双引号括起来的字符,除$.倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作 ...

  6. Serlvet学习笔记之二—不同页面共享数据

    一共有四种方法实现共享页面共享数据 1.cookie 2.sendRedirect 3.session 4.隐藏表单提交(form) 5.ServletContex 1.cookie:服务器在客户端保 ...

  7. 电脑CPU的发展史(转)

    Intel于1971年发售了自己的第一款4位微处理器,设计与ROM 4001,RAM 4002和移位寄存器4003配合工作.其中4004自身负责运算,其它部分则是使CPU正常工作的重要组成.大部分40 ...

  8. java框架---->zxing框架的使用

    今天我们就来学习一下zxing的用法,这里只涉及到java se的部分. zxing的学习 如果在java se环境中使用zxing,需要在maven的pom.xml中添加依赖: <depend ...

  9. VIM 插入

    不知道有多少VIM新手和我当年(去年)一样,信誓旦旦的以为只有i可以插入 唉,现在想想都觉得可笑,都是Windows下的编辑器用多了的结果 鼠标一点,妈妈再也不用担心我的文本插入了……悲剧! 好了,让 ...

  10. IE8及以下的数组处理与其它浏览器的不同

    在解决search-box的bug时,由于IE8-的数组处理与其它浏览器的不同,而导致报错. 示例:arr=[1,3,3,]; 当数组的最后是一个逗号时: IE9+默认 arr=[1,3,3];也就是 ...