---恢复内容开始---

题意略。

这题在poj直接求最小费用会超时,但是题意也没说要求最优解。

根据线圈定理,如果一个跑完最费用流的残余网络中存在负权环,那么顺着这个负权环跑流量为1那么会得到更小的费用。

关键是坑在找环的起点。其实看了代码之后发现的确不难...

#include<stdio.h>
#include<queue>
#include<string.h>
#define MAXN 300
#define MAXM 30002*4
#define INF 10000000
using namespace std;
//起点编号必须最小,终点编号必须最大
bool vis[MAXN]; //spfa中记录是否在队列里边
int sum[],nnum[MAXN],zhong;
struct point{
int x,y,c;
}from[],to[];
struct edge{
edge *next,*op; //op是指向反向边
int t,c,v; //t下一个点编号,c容量,v权值
}ES[MAXM],*V[MAXN]; //ES边静态邻接表,V点的编号
int N,M,S,T,EC=-; //S源点最小,T汇点最大,EC当前边数
int demond[MAXN],sp[MAXN],prev[MAXN]; //spSPFA中记录距离,prev记录上一个点路径
edge *path[MAXN]; //与prev同步记录,记录到上一条边
int cal(point a,point b){
return max(a.x-b.x,b.x-a.x)+max(a.y-b.y,b.y-a.y)+;
}
void addedge(int a,int b,int v,int c,int cc){
edge e1={V[a],,b,c,v},e2={V[b],,a,cc,-v};
ES[++EC]=e1;V[a]=&ES[EC];
ES[++EC]=e2;V[b]=&ES[EC];
V[a]->op=V[b];V[b]->op=V[a];
}
bool SPFA(int st,int up){
int u,v;
memset(nnum,,sizeof(nnum));
memset(vis,,sizeof(vis));
for(u=;u<=up;u++){
sp[u]=INF;
}
queue<int>q;
q.push(st);
sp[st]=;
vis[st]=;
nnum[st]++;
while(!q.empty()){
u=q.front();
vis[u]=;
q.pop();
for(edge *k=V[u];k;k=k->next){
v=k->t;
if(k->c>&&sp[u]+k->v<sp[v]){
sp[v]=sp[u]+k->v;
prev[v]=u;
path[v]=k;
if(vis[v]==){
nnum[v]++;
if(nnum[v]>=up){
zhong=v;
return ;
}
vis[v]=;
q.push(v);
}
}
}
}
return ;
}
int argument(){
memset(vis,,sizeof(vis));
int i,cost=,flow=;
edge *e;
for(i=zhong;;i=prev[i]){
if(vis[i]==)vis[i]=;
else break;
}
zhong=i;
bool ok=;
memset(vis,,sizeof(vis));
for(i=zhong;;){
if(!vis[i])vis[i]=;
else break;
e=path[i];
e->c-=cost;e->op->c+=cost;
flow+=e->v*cost;
vis[i]=;
i=prev[i];
//if(i==zhong)break;
}
return flow;
}
int maxcostflow(int tans,int up){
int Flow=tans;
if(SPFA(,up)){
Flow+=argument();
}
return Flow;
}
void init(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
EC=-;
memset(sum,,sizeof(sum));
int tans=;
for(int i=;i<MAXN;i++){
V[i]=NULL;
}
for(int i=;i<n;i++){
scanf("%d%d%d",&from[i].x,&from[i].y,&from[i].c);
}
for(int i=;i<m;i++){
scanf("%d%d%d",&to[i].x,&to[i].y,&to[i].c);
}
for(int i=;i<n;i++){
for(int j=;j<m;j++){
int tmp;
scanf("%d",&tmp);
addedge(i+,j++n,cal(from[i],to[j]),INF,tmp);
tans+=cal(from[i],to[j])*tmp;
sum[j]+=tmp;
}
}
T=n+m+;
for(int i=;i<=m;i++){
addedge(i+n,T,,to[i-].c-sum[i-],sum[i-]);
}
int ans=maxcostflow(tans,T);
if(ans==tans)puts("OPTIMAL");
else{
puts("SUBOPTIMAL");
for(int i=;i<n;i++){
for(int j=;j<m;j++){
for(edge *k=V[j++n];k;k=k->next){
if(k->t==i+){
printf("%d",k->c);
if(j!=m-)printf(" ");
else printf("\n");
break;
}
}
}
}
}
}
}
int main(){
init();
return ;
}

---恢复内容结束---

POJ 2157 Evacuation Plan [最小费用最大流][消圈算法]的更多相关文章

  1. POJ 2175:Evacuation Plan(费用流消圈算法)***

    http://poj.org/problem?id=2175 题意:有n个楼,m个防空洞,每个楼有一个坐标和一个人数B,每个防空洞有一个坐标和容纳量C,从楼到防空洞需要的时间是其曼哈顿距离+1,现在给 ...

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

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

  3. POJ 3680 Intervals 最小费用最大流(MCMF算法)

    题意:给出 n ,k 表示接下来给你 n 段开区间,每段区间都有它的权值,问选出一些区间,使它的权值最大,并且在实轴上的每个点,不得超过 k次被覆盖. 思路:首先要理解建图思路,首先有一个基图,相邻点 ...

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

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

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

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

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

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

  7. poj2175费用流消圈算法

    题意:      有n个建筑,每个建筑有ai个人,有m个避难所,每个避难所的容量是bi,ai到bi的费用是|x1-x2|+|y1-y2|+1,然后给你一个n*m的矩阵,表示当前方案,问当前避难方案是否 ...

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

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

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

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

随机推荐

  1. Zookeeper工作原理一

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其 ...

  2. Struts2中s:set标签和s:if标签小结

    1.  s:set标签 格式:<s:set name="" value="" scope=””/> 说明:把jsp页面中的一个值,以name存储起来 ...

  3. 类型参数约束 : Controller where T : class,new()

    这是类型参数约束,.NET支持的类型参数约束有以下五种: where T : struct | T必须是一个结构类型 where T : class | T必须是一个类(class)类型,不能是结构( ...

  4. 如何修改Oracle字符集

    一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...

  5. 每日学习心得:未定义的命名空间前缀"xsd"问题和<%%>、<%=%>、<%$%>、<%@%>的区别

    2013-6-29 1. 未定义的命名空间前缀“xsd” 上周在项目开发中遇到这样的一个问题,在一个页面用到了自定义的Picker控件,在IE6.7.8.9以及IE10兼容模式下都没有任何问题,但是一 ...

  6. Jaxb笔记

    摘自: http://www.blogjava.net/eagle-daiq/archive/2012/01/30/369016.html 最近项目原因,研究了下jaxb.jaxb是Java api ...

  7. Async 和 Await的性能(.NET4.5新异步编程模型)

    异步编程长时间以来一直都是那些技能高超.喜欢挑战自我的开发人员涉足的领域 — 这些人愿意花费时间,充满热情并拥有心理承受能力,能够在非线性的控制流程中不断地琢磨回调,之后再回调. 随着 Microso ...

  8. LintCode "Coins in a Line III" !!

    https://codesolutiony.wordpress.com/2015/05/24/lintcode-coins-in-a-line-iii/ A very juicy one! Deser ...

  9. Python控制流语句(if,while,for)

    if.py number=23 guess=int(input("enter an int:")) if guess==number: print ("congratul ...

  10. Nginx实现内参:为什么架构很重要?

    Nginx在web开发者眼中就是高并发高性能的代名词,其基于事件的架构也被众多开发者效仿.我从Nginx的网站找到一篇技术文章将Nginx是怎样实现的,文章是Nginx的产品老大Owen Garret ...