求最大费用能够将边权取负以转化成求最小费用。

然而此时依旧不正确。由于会优先寻找最大流。可是答案并不一定出如今满流的时候。所以要加一些边(下图中的红边)使其在答案出现时满流。

设全部边的流量为1,花费例如以下图所看到的。

显然最大花费是1001。而没有红边的情况下会得到3。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map> #pragma comment(linker, "/STACK:1024000000");
#define EPS (1e-8)
#define LL long long
#define ULL unsigned long long
#define _LL __int64
#define INF 0x3f3f3f3f
#define Mod 6000007 using namespace std; struct E
{
int u,v,Max,cost,next;
}edge[200100]; int head[310];
int cur[310]; int Top; void Link(int u,int v,int w,int cost)
{
edge[Top].u = u;
edge[Top].v = v;
edge[Top].cost = cost;
edge[Top].Max = w;
edge[Top].next = head[u];
head[u] = Top++;
} struct Q
{
int v;
// bool operator < (const Q &a) const {
// return a.cost < cost;
// }
}; void Updata(int site,int flow,int &cost)
{
for(int i = site;cur[i] != -1; i = edge[cur[i]^1].v)
{
edge[cur[i]].Max -= flow;
edge[cur[i]^1].Max += flow;
cost += edge[cur[i]].cost*flow;
}
} int dis[310];
int flow[310]; bool mark[310]; queue<Q> q; int Spfa(int S,int T,int n,int &cost)
{
while(q.empty() == false)
q.pop(); memset(mark,false,sizeof(bool)*(n+2));
memset(dis,INF,sizeof(int)*(n+2));
memset(flow,INF,sizeof(int)*(n+2));
dis[S] = 0; Q f,t; f.v = S;
dis[S] = 0;
cur[S] = -1;
mark[S] = true;
q.push(f); while(q.empty() == false)
{
f = q.front();
q.pop();
mark[f.v] = false;
for(int p = head[f.v]; p != -1; p = edge[p].next)
{
t.v = edge[p].v; if(edge[p].Max && dis[t.v] > dis[f.v] + edge[p].cost)
{
cur[t.v] = p;
dis[t.v] = dis[f.v] + edge[p].cost;
flow[t.v] = min(flow[f.v],edge[p].Max); if(mark[t.v] == false)
{
mark[t.v] = true;
q.push(t);
}
}
}
} if(dis[T] != INF)
{
Updata(T,flow[T],cost);
return flow[T];
} return 0;
} int Cal_MaxFlow_MinCost(int S,int T,int n)
{
int f = 0,cost = 0,temp; do
{
temp = Spfa(S,T,n,cost);
f += temp;
}while(temp); printf("%d\n",-cost); return cost;
} int val[110]; int main()
{
int n; int u,v,w,i,j,x; while(scanf("%d",&n) && n)
{
memset(head,-1,sizeof(int)*(2*n+3));
Top = 0;
for(i = 1;i <= n; ++i)
{
scanf("%d",&val[i]);
} int S = 1,T = 2*n+2; for(i = 1;i <= n; ++i)
{
Link(S,i+1,1,0);
Link(i+1,S,0,0);
Link(n+i+1,T,1,0);
Link(T,n+i+1,0,0);
Link(i+1,T,1,0);
Link(T,i+1,0,0);
} for(i = 1;i <= n; ++i)
{
for(j = 1;j <= n; ++j)
{
scanf("%1d",&x);
if(x)
{
Link(i+1,j+n+1,1,-(val[i]^val[j]));
Link(j+n+1,i+1,0,(val[i]^val[j]));
}
}
}
Cal_MaxFlow_MinCost(S,T,T);
}
return 0;
}

HDU 3395 Special Fish 最“大”费用最大流的更多相关文章

  1. HDU 3395 Special Fish(拆点+最大费用最大流)

    Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  2. [ACM] HDU 3395 Special Fish (最大重量二分图匹配,KM算法)

    Special Fish Problem Description There is a kind of special fish in the East Lake where is closed to ...

  3. HDU3395 Special Fish(最大费用任意流)

    题目要的并不是最大匹配下得到的最大的结果. 网上流行的做法是加边.其实,在连续增广的时候求得一个可行流的总费用为负就停止这样就行了. #include<cstdio> #include&l ...

  4. hdu 2686&&hdu 3376(拆点+构图+最小费用最大流)

    Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. 最小/大费用最大流模板(codevs1914)

    void addedge(int fr,int to,int cap,int cos){ sid[cnt].fr=fr;sid[cnt].des=to;sid[cnt].cap=cap;sid[cnt ...

  6. HDU 4744 Starloop System(最小费用最大流)(2013 ACM/ICPC Asia Regional Hangzhou Online)

    Description At the end of the 200013 th year of the Galaxy era, the war between Carbon-based lives a ...

  7. HDU 1853 Cyclic Tour(最小费用最大流)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others) Tota ...

  8. 【HDU 4807】Lunch Time 最小费用最大流

    题意 在一个有向图当中,现在每一条边带有一个容量,现在有K个人在起点,需要到终点去吃饭,询问这K个人最后一个人到达食堂的最小时间是多少 贴一篇题解:http://blog.csdn.net/u0137 ...

  9. hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))

    Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

随机推荐

  1. Spring Mongo配置多个Mongos

    由于数据存储使用MongoDB集群,在对外访问的时候,地址是Mongos的地址,在使用的过程中没有发现任何问题,配置如下: <mongo:mongo host="${mongodb.h ...

  2. linux 用户管理,用户权限管理,用户组管理

    linux 用户管理,用户权限管理,用户组管理 一:ls -l 命令 解释 第个d表示是目录,如果是文件是-,如果是连接是l 第2到4个 rwx 表示创建者的操作权限 r 读,w 写,x 执行 第5到 ...

  3. vim配置 高亮+自动缩进+行号+折叠+优化

    一:修改 .vimrc即可 二: set nocompatible " 关闭 vi 兼容模式syntax on " 自动语法高亮colorscheme molokai " ...

  4. Android Gson解析json详解

    目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:https://co ...

  5. 解决java.sql.SQLException: Incorrect string value: '\xE6\x88\x91\xE7\x9A\x84...' for column 'groupName'

    今天使用mysql,用java程序往mysql中写数据,出现如下错误: Caused by: java.sql.SQLException: Incorrect string value: '\xD3\ ...

  6. KNOCKOUTJS DOCUMENTATION-绑定(BINDINGS)-自定义绑定

    除了ko内建的绑定,还可以自定义绑定,灵活地封装复杂的行为使之可重用. 自定义绑定 注册自定义绑定 向 ko.bindingHandles添加一个子属性来注册一个绑定. ko.bindingHandl ...

  7. 同域名不同端口应用共享sessionid问题解决办法

    相同域名共享sessionid 如 www.abc.com www.abc.com/test www.abc.com:8080 www.abc.com:8989 这些地址由于是在相同的域名下,所以共享 ...

  8. Loadrunner脚本回放 场景运行过程中常见错误分析

    问题一:Loadrunner超时错误问题描述 Loadrunner超时错误:在录制Web协议脚本回放时超时情况经常出现,产生错误的原因也有很多,解决的方法也不同. 问题现象Error -27728: ...

  9. Word基础总结

    Word文本的操作 一.文 ◎Backspace(退格键) 删除光标以左的内容    ◎Delete (删除键)    删除光标以右的内容     #实话之前一直没在意,一直用backspace删除 ...

  10. 通过配置Apache实现404页面替换

    一.通用情况--修改apache配置.htaccess 一般网站报404原因都是找不到资源,是服务器(以Apache为例)报错,Apache自定义了404输出,我们的目的是使用自定义的404.html ...