重新切一遍最小费用最大流~~~

这到题目的数据范围有问题,尽量开大就好了~~

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
#define INF 999999
struct list
{
int u;
int v;
int next;
}node[1000001];
int num;
int head[1001];
int cost[1001][1001];
void add(int l,int r,int v)
{
node[num].u=r;
node[num].v=v;
node[num].next=head[l];
head[l]=num++;
}
int nos;
int juli(int x,int y,int m)
{
return abs(y/m-x/m)+abs(y%m-x%m);
}
int pre[1001];
int bfs()
{
int visit[1001];
int dist[1001];
int i;
for(i=0;i<=nos;i++)dist[i]=INF;
memset(visit,0,sizeof(visit));
memset(pre,-1,sizeof(pre));
queue<int>q;
q.push(0);
visit[0]=1;
dist[0]=0;
while(!q.empty())
{
int e=q.front();
q.pop();
//cout<<"弹"<<" "<<e<<endl;
visit[e]=0;
for(i=head[e];i!=-1;i=node[i].next)
{
int r=node[i].u;
if(dist[e]+node[i].v<dist[r]&&cost[e][r])
{
pre[r]=e;
dist[r]=dist[e]+node[i].v;
// printf("pre[%d]=%d,dist[%d]=%d\n",r,e,r,dist[r]);
if(!visit[r])
{
q.push(r);
// cout<<"入"<<" "<<r<<endl;
visit[r]=1;
}
}
}
}
if(dist[nos]!=INF)return 1;
return 0;
}
void change()
{
int minx;
minx=INF;
int i;
for(i=nos;pre[i]!=-1;i=pre[i])
{
minx=min(minx,cost[pre[i]][i]);
}
for(i=nos;pre[i]!=-1;i=pre[i])
{
cost[pre[i]][i]-=minx;
cost[i][pre[i]]+=minx;
}
}
int main()
{
int i,j,m,n;
char str[100001];
while(scanf("%d%d%*c",&n,&m)&&(n||m))
{
memset(head,-1,sizeof(head));
memset(cost,0,sizeof(cost));
int hm,mm;
hm=mm=0;
int ms[100001];
int hs[100001];
for(i=0;i<n;i++)
{
scanf("%s",str);
for(j=0;j<m;j++)
{
if(str[j]=='m')ms[++mm]=i*m+j;
else if(str[j]=='H')hs[++hm]=i*m+j;
}
getchar();
}
nos=hm+mm+1;
for(i=1;i<=mm;i++)
{
add(0,i,0);
add(i,0,0);
cost[0][i]=1;
cost[i][0]=0;
}
for(j=1;j<=hm;j++)
{
add(j+mm,mm+hm+1,0);
add(mm+hm+1,j+mm,0);
cost[j+mm][mm+hm+1]=1;
cost[mm+hm+1][j+mm]=0;
}
for(i=1;i<=mm;i++)
{
for(j=1;j<=hm;j++)
{
int ju=juli(ms[i],hs[j],m);
add(i,j+mm,ju);
add(j+mm,i,-ju);
cost[i][j+mm]=INF;
cost[j+mm][i]=0;
}
}
while(bfs())
{
change();
//cout<<"------------------------------------"<<endl;
}
int sum=0;
for(i=1;i<=mm;i++)
for(j=1;j<=hm;j++)
{
sum+=(INF-cost[i][j+mm])*juli(ms[i],hs[j],m);
}
cout<<sum<<endl;
}
return 0;
}

poj-2195-Going Home最小费用最大流的更多相关文章

  1. POJ 2195 - Going Home - [最小费用最大流][MCMF模板]

    题目链接:http://poj.org/problem?id=2195 Time Limit: 1000MS Memory Limit: 65536K Description On a grid ma ...

  2. POJ 2195 Going Home 最小费用最大流 尼玛,心累

    D - Going Home Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...

  3. poj 2195 Going Home(最小费用最大流)

    题目:http://poj.org/problem?id=2195 有若干个人和若干个房子在一个给定网格中,每人走一个都要一定花费,每个房子只能容纳一人,现要求让所有人进入房子,且总花费最小. 构造一 ...

  4. poj 2351 Farm Tour (最小费用最大流)

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17230   Accepted: 6647 Descri ...

  5. POJ 2157 Evacuation Plan [最小费用最大流][消圈算法]

    ---恢复内容开始--- 题意略. 这题在poj直接求最小费用会超时,但是题意也没说要求最优解. 根据线圈定理,如果一个跑完最费用流的残余网络中存在负权环,那么顺着这个负权环跑流量为1那么会得到更小的 ...

  6. poj 2135 Farm Tour 最小费用最大流建图跑最短路

    题目链接 题意:无向图有N(N <= 1000)个节点,M(M <= 10000)条边:从节点1走到节点N再从N走回来,图中不能走同一条边,且图中可能出现重边,问最短距离之和为多少? 思路 ...

  7. POJ 3680: Intervals【最小费用最大流】

    题目大意:你有N个开区间,每个区间有个重量wi,你要选择一些区间,使得满足:每个点被不超过K个区间覆盖的前提下,重量最大 思路:感觉是很好想的费用流,把每个区间首尾相连,费用为该区间的重量的相反数(由 ...

  8. POJ 2135 Farm Tour [最小费用最大流]

    题意: 有n个点和m条边,让你从1出发到n再从n回到1,不要求所有点都要经过,但是每条边只能走一次.边是无向边. 问最短的行走距离多少. 一开始看这题还没搞费用流,后来搞了搞再回来看,想了想建图不是很 ...

  9. [poj] 1235 Farm Tour || 最小费用最大流

    原题 费用流板子题. 费用流与最大流的区别就是把bfs改为spfa,dfs时把按deep搜索改成按最短路搜索即可 #include<cstdio> #include<queue> ...

  10. POJ 2516 Minimum Cost [最小费用最大流]

    题意略: 思路: 这题比较坑的地方是把每种货物单独建图分开算就ok了. #include<stdio.h> #include<queue> #define MAXN 500 # ...

随机推荐

  1. Restful 和 Jersey介绍(Web Service )

    一:REST简单介绍 REST 2000 年由 Roy Fielding 在博士论文中提出,他是 HTTP 规范 1.0 和 1.1 版的首席作者之中的一个. REST 中最重要的概念是资源(reso ...

  2. OnClientClick和OnClick

    OnClientClick是客户端事件处理方法,一般采用JavaScript来进行处理,也就是直接在IE端运行,一点击就运行 OnClick是服务器端事件处理函数,使用C#或者vb.net,在服务器端 ...

  3. 重操JS旧业第八弹:面向对象与继承

    js里面没有语言语法层面的继承机制,但这并不意味着js就不能实现继承,利用js属性和方法动态性来模拟实现继承,通过总结大概有如下方法实现: 1 原型链继承 我们知道原型在对象中扮演着重要的角色,函数本 ...

  4. 组件状态(TComponentState)11种和组件状态(TComponentStyle)4种

    TOperation = (opInsert, opRemove); TComponentState = set of ( csAncestor The component was introduce ...

  5. inode结构体成员详解

    概述:inode译成中文就是索引节点,它用来存放档案及目录的基本信息,包含时间.档名.使用者及群组等.inode分为内存中的inode和文件系统中的inode,为了避免混淆,我们称前者为VFS ino ...

  6. Android学习笔记(九)——更复杂的进度对话框

    显示操作进度的对话框 1.使用上一篇创建的同一项目.在activity_main.xml文件里加入一个Button: <Button android:id="@+id/btn_dial ...

  7. MyBatis简单的增删改查以及简单的分页查询实现

    MyBatis简单的增删改查以及简单的分页查询实现 <? xml version="1.0" encoding="UTF-8"? > <!DO ...

  8. leetcode先刷_Path Sum

    水的问题不解释,具有参数保持部和,当它到达一个叶子节点,推断是否与给予平等. 需要注意的是节点在树中的数目值它可以是正的或负.它不使用,修剪.有仅仅存在罐.因此,关于或代表最终结果的字. bool h ...

  9. ORACLE 五种表的优缺点总结

    ORACLE 五种表的优缺点总结: 1.普通表(heap table):适合大部分设计场景,有长处也有缺点. 长处: a,语法简单方便 b,适合大部分场景 缺点: a,更新日志开销较大 b,Delet ...

  10. 微凉大大,教你一步一步在linux中正确的安装Xcache加速php。

    首先,强烈吐槽,百度上的教程,都左复制右复制的,乱七八糟,缺东缺西的.借此微凉大大我提供我苦心整理好的教程.以便各位小菜能顺利的使用Xcache加速php,假设看完了,也操作了,还是失败了的话,请联系 ...