题意: 在一般费用流题目改动:路过某路,每x单位流量须要花费 ai*x^2(ai为给定的系数)。

開始的的时候,一看仅仅只是是最后统计费用上在改动罢了,一看例子。发现根本没那么简单(ps:以后每次写程序前先看例子能不能过。),由于是成平方关系。每次一流量增广的话。下次未必最优!于是想到我每次仅仅增长一个单位流量。每次增长一个单位之后,该路径上的全部边的费用边改为i^2-(i-1)^2,(第一次肯定增广a,其次的话3a.5a.7a.。。。由于第一次已经增广了,和为第i次i平方就可以!

)如此。符合题意!

一提交Wa!扫了一遍代码,发现反向边的费用没有改!

于是改动:想到反向边的本质是提供懊悔机会,而我控制的是每次增长一个单位!懊悔一次的话,必定是付上一次的费用!

所以,与平时不同:初始化反向边费用也为W(不是-W)。每次增广改动为-1a.-3a.-5a,这样控制比正向边慢一步。(事实上这才是反向边的本质作用,仅仅是平时时候费用是不变的,所以无需如此!)提交后AC!

(ps:感觉对费用流算法内部逻辑更加清晰了有木有)

后来看了网上的题解:看数据流量为<5,所以每条边拆为流量为1的,每条费用也如此递增。其次,这样本质是还是每次增广流量1,可谓异曲同工。

只是拆边的思想值得借鉴。

额外收获:1:注意看数据范围,有时候能够从上面思考算法。2:写程序前先过一遍例子,也许有思路启示。

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int maxv=200;
const int maxe=5000*2*2;
const int inf=0x3f3f3f3f;
int nume=0;int e[maxe][5];int head[maxv];
int n,m,k;
void inline adde(int i,int j,int c,int w,int f) //新加入一个參数f,记录初始费用。费用w改变
{
e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;
e[nume][2]=c;e[nume][3]=w;e[nume++][4]=f;
e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;
e[nume][2]=0;e[nume][3]=w;e[nume++][4]=f;
}
int inq[maxv];int pre[maxv];int prv[maxv];
int d[maxv];
bool spfa(int &sum,int &flow)
{
int s=0,t=n+1;
for(int i=0;i<=n+3;i++)
{
inq[i]=0;
d[i]=inf;
}
queue<int>q;
q.push(s);
inq[s]=1;
d[s]=0;
while(!q.empty())
{
int cur=q.front();
q.pop();
inq[cur]=0;
for(int i=head[cur];i!=-1;i=e[i][1])
{
int v=e[i][0];
if(e[i][2]>0&&d[cur]+e[i][3]<d[v])
{
d[v]=d[cur]+e[i][3];
pre[v]=i;
prv[v]=cur;
if(!inq[v])
{
q.push(v);
inq[v]=1;
}
}
}
}
if(d[t]==inf)return 0;
int cur=t;
int minf=1; //每次增广一个单位
while(cur!=s)
{
int fe=pre[cur];
e[fe][3]+=e[fe][4]*2; //关键点。
e[fe^1][3]-=e[fe][4]*2; //比正向边慢一步更新。(初始值来控制)
cur=prv[cur];
}
cur=t;
while(cur!=s)
{
e[pre[cur]][2]-=minf;
e[pre[cur]^1][2]+=minf;
cur=prv[cur];
}
flow+=minf;
sum+=d[t]; //,每次一单位,不用说,最短路即为总费用
return 1;
}
int mincost(int &flow)
{
int sum=0;
while(spfa(sum,flow));
return sum;
}
void init()
{
nume=0;
for(int i=0;i<=n+2;i++)
head[i]=-1;
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
init();
int a,b,x,c;
for(int j=0;j<m;j++)
{
scanf("%d%d%d%d",&a,&b,&x,&c);
adde(a,b,c,x,x);
}
adde(0,1,k,0,0);
adde(n,n+1,k,0,0); //附加边来推断流量满否,方便
int flow=0;
int ans=mincost(flow);
if(flow!=k)
printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}

hdu 3667 /2010哈尔滨赛区H题 费用与流量为非线性关系/费用流的更多相关文章

  1. hdu 4548 第六周H题(美素数)

    第六周H题 - 数论,晒素数 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   De ...

  2. hdu 4460 第37届ACM/ICPC杭州赛区H题 STL+bfs

    题意:一些小伙伴之间有朋友关系,比如a和b是朋友,b和c是朋友,a和c不是朋友,则a和c之间存在朋友链,且大小为2,给出一些关系,求出这些关系中最大的链是多少? 求最短路的最大距离 #include& ...

  3. 2017北京赛区H题

    题目链接 题意:在n*m的矩阵中选择变换或者不变换一个数变成p,使得最大子矩阵和最小 1<=n,m<=150, -1000<=p<=1000; 题解: 他人题解链接 涉及到知识 ...

  4. zoj 3662 第37届ACM/ICPC长春赛区H题(DP)

    题目:给出K个数,使得这K个数的和为N,LCM为M,问有多少种 f[i][j][k]表示选i个数,总和为j,最小公倍数为k memery卡的比较紧,注意不要开太大,按照题目数据开 这种类型的dp也是第 ...

  5. 2013年 ACMICPC 杭州赛区H题

    思路:树状数组统计.待验证,不知道是否对. #include<cstdio> #include<cstring> #include<cmath> #include& ...

  6. HDU 3667 Transportation(网络流之费用流)

    题目地址:HDU 3667 这题的建图真是巧妙...为了保证流量正好达到k.须要让每一次增广到的流量都是1,这就须要把每一条边的流量都是1才行.可是每条边的流量并非1,该怎么办呢.这个时候能够拆边,反 ...

  7. HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011亚洲北京赛区网络赛)

    HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011 亚洲北京赛区网络赛题目) Eliminate Witches! Time Limit: 2000/1000 ...

  8. HDU 3667 费用流 拆边 Transportation

    题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: ...

  9. HDU 3667.Transportation 最小费用流

    Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. ping & traceroute 原理

    说明: 忘记从哪里看到的原文了. 不过我应该进行了大刀阔斧的删选. ping 用类型码为0的ICMP发请 求,受到请求的主机则用类型码为8的ICMP回应. ping程序来计算间隔时间,并计算有多少个包 ...

  2. 更改mvc版本的时候,手动修改交3.0改到4.0,将razor改到2.0,仍然提示出现错误,mvc3.0

    偶然碰到,更改mvc版本,由3.0升级到4.0,但是依然提示3.0的错误 几经周折排查,最终发现 <runtime> <assemblyBinding xmlns="urn ...

  3. [bzoj2127]happiness——最小割

    这个题太恶心了...并不想继续做了... 本代码在bzoj上TLE! 大致说一下思路: 建立ST,首先由S连边(S,u,a)a代表学文的分数,连向T(u,T,b)b表示学理的分数,这样构造出了两个人独 ...

  4. [LeetCode] Sqrt(x) 二分搜索

    Implement int sqrt(int x). Compute and return the square root of x. Hide Tags Math Binary Search     ...

  5. centos 7 安装配置mod_security

    1.旧版本安装过程: http://blog.secaserver.com/2011/10/install-mod_security-apache2-easiest/ http://www.cnblo ...

  6. error MSB3073 解决方法(转)

    原文转自 http://blog.csdn.net/yangjie569889321/article/details/28488151 最近将VC2002 代码移植到VC2010,出现编译错误:1&g ...

  7. 颜色混合opengl--glBlendFunc函数

    http://www.cnblogs.com/ylwn817/archive/2012/09/07/2675285.html 颜色混合opengl--glBlendFunc函数 原文:http://b ...

  8. Java微信公众平台开发_01_本地服务器映射外网

    做微信开发之前,我们需要先做一个内网穿透,让我们的工程可以在公网上被访问. 一.工具列表 内网穿透的相关工具有: (1)natapp 官网 :https://natapp.cn/ (2)花生壳 官网: ...

  9. PHP源码加密- php-beast

    php-beast 详细介绍 使用案例: http://www.beastcoder.com/ PHP Beast是一个源码加密模块,使用这个模块可以把PHP源码加密并在此模块下运行. 为什么要用PH ...

  10. js-监听页面滚动

    两种监听页面滚动的方法 一.原生js通过window.onscroll监听 window.onscroll = function() { //为了保证兼容性,这里取两个值,哪个有值取哪一个 //scr ...