/**
题目:hdu3667 Transportation 拆边法+最小费用最大流
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667
题意:n个城市由m条有向边连接。要从城市1运输k流量到城市n。每条边有可以运输的流量容量,以及费用系数ai。
费用系数指该条边的费用为该条边的运输流量x的平方乘以ai。即ai*x^2。 如果无法运输k流量,输出-1,否则输出从城市1运输k流量到城市n的最小花费。 思路:拆边法+最小费用最大流 假设从u->v 容量为5, 费用系数为a。 那么拆成五条容量为1的边,每条边的费用分别为 a,3*a,5*a,7*a,9*a。 (如果容量更大,拆成更多边,继续11*a,13*a...) 因为是最小费用流,如果当前流量为1,那么肯定经过费用为a(1*1*a = a)的这条边,如果流量为2,那么肯定经过费用为a和费用为3a的边(满足:x^2*ai = 2^2*a=4a); 其他类推。 然后就是普通的最小费用最大流。 由于本题是要输出运输k流量的最小流,所以增加源点s,汇点t。 s->1,cap=k,cost=0; n->t,cap=k,cost=0; 求s到t的最小费用最大流即可。 如果最大流flow<k。那么-1。否则cost为正解。 */
#include<iostream>
#include<cstring>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long LL;
const int N = ;
struct Edge{
int from, to, cap, flow, cost;
Edge(int u,int v,int c,int f,int w):from(u),to(v),cap(c),flow(f),cost(w){}
};
struct MCMF{
int n, m;
vector<Edge> edges;
vector<int> G[N];
int inq[N];
int d[N];
int p[N];
int a[N]; void init(int n){
this->n = n;
for(int i = ; i <= n; i++) G[i].clear();
edges.clear();
} void AddEdge(int from,int to,int cap,long long cost){
edges.push_back(Edge(from,to,cap,,cost));
edges.push_back(Edge(to,from,,,-cost));
m = edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
} bool BellmanFord(int s,int t,int &flow,long long &cost){
for(int i = ; i <= n; i++) d[i] = INF;
memset(inq, , sizeof inq);
d[s] = ; inq[s] = ; p[s] = ; a[s] = INF; queue<int> Q;
Q.push(s);
while(!Q.empty()){
int u = Q.front(); Q.pop();
inq[u] = ;
for(int i = ; i < G[u].size(); i++){
Edge& e = edges[G[u][i]];
if(e.cap>e.flow&&d[e.to]>d[u]+e.cost){
d[e.to] = d[u]+e.cost;
p[e.to] = G[u][i];
a[e.to] = min(a[u],e.cap-e.flow);
if(!inq[e.to]) {Q.push(e.to); inq[e.to] = ;}
}
}
}
if(d[t]==INF) return false;
flow += a[t];
cost += (long long)d[t]*(long long)a[t];
for(int u = t; u!=s; u = edges[p[u]].from){
edges[p[u]].flow+=a[t];
edges[p[u]^].flow-=a[t];
}
return true;
}
int MincostMaxflow(int s,int t,long long &cost){
int flow = ;
cost = ;
while(BellmanFord(s,t,flow,cost));
return flow;
}
};
int main()
{
int n, m, k;
while(scanf("%d%d%d",&n,&m,&k)==)
{
int s = , t = n+;
MCMF mcmf;
mcmf.init(t);
mcmf.AddEdge(s,,k,);
mcmf.AddEdge(n,t,k,);
int u, v, a, c;
for(int i = ; i <= m; i++){
scanf("%d%d%d%d",&u,&v,&a,&c);
for(int j = , cnt = ; j <= c; j++, cnt+=){
mcmf.AddEdge(u,v,,a*cnt);
}
}
long long cost;
int flow = mcmf.MincostMaxflow(s,t,cost);
if(flow<k){
printf("-1\n");
}else
{
printf("%lld\n",cost);
}
}
return ;
}

hdu3667 Transportation 费用与流量平方成正比的最小流 拆边法+最小费用最大流的更多相关文章

  1. HDU3667 Transportation —— 最小费用流(费用与流量平方成正比)

    题目链接:https://vjudge.net/problem/HDU-3667 Transportation Time Limit: 2000/1000 MS (Java/Others)    Me ...

  2. HDU 3667 费用流 拆边 Transportation

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

  3. hdu 3667 /2010哈尔滨赛区H题 费用与流量为非线性关系/费用流

    题意: 在一般费用流题目改动:路过某路,每x单位流量须要花费 ai*x^2(ai为给定的系数). 開始的的时候,一看仅仅只是是最后统计费用上在改动罢了,一看例子.发现根本没那么简单(ps:以后每次写程 ...

  4. 资深阿里程序员一一为你解刨Web前端知识体系结构,付出与收获成正比!

    只要接触过前端,都会指导web前端的知识主要由三部分组成:分别为静态html,样式css,动态javascript(简称js)这三大部分组成.其三部分组成的一个体系的复杂程度不亚于其他一门技术的复杂程 ...

  5. hdu 3667(最小费用最大流+拆边)

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

  6. UVA1486 Transportation 费用流 拆边。

    #include <iostream> #include <cstdio> #include <cmath> #include <queue> #inc ...

  7. 纹理特征描述之自相关函数法 纹理粗糙性与自相关函数的扩展成正比 matlab代码实现

    图像中通常采用自相关函数作为纹理测度 自相关函数的定义为: ​ 调用自定义函数 zxcor()对砖墙面和大理石面纹理进行分析: 自定义函数 zxcor(): function [epsilon,eta ...

  8. POJ 2135.Farm Tour 消负圈法最小费用最大流

    Evacuation Plan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4914   Accepted: 1284   ...

  9. hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)

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

随机推荐

  1. 怎样在Ubuntu手机应用中得到全部的环境变量值

    我们在先前的例程中已经通过一些方法得到我们应用的一些环境变量值.这些值有的很实用.比方我们能够得到我们应用所仅仅能訪问的文件夹.在今天的例程中,我们来展示一种方法能够得到应用全部的环境变量.在我们的实 ...

  2. STL_算法_区间的比較(equal、mismatch、 lexicographical_compare)

    C++ Primer 学习中.. . 简单记录下我的学习过程 (代码为主) //全部容器适用 equal(b,e,b2)       //用来比較第一个容器[b,e)和第二个容器b2开头,是否相等 e ...

  3. CDN新应用和客户

    目前的CDN配置服务主要应用于证券.金融保险.ISP.ICP.网上交易.门户网站.大中型公司.网络教学等领域.另外在行业专网.互联网中都可以用到,甚至可以对局域网进行网络优化.利用CDN,这些网站无需 ...

  4. 使用gradle构建Android时 版本号versionName中嵌入git提交信息

    为什么要这么做   在应用开发的版本迭代过程中,通过版本号并不能快速定位到所对应的代码,导致在后面分析问题追溯对应版本的代码时比较麻烦.   如果代码是通过git来管理的,git的commit id等 ...

  5. RxAndroid 的基本使用

    1.基本概念 Rx是RxJava针对Android的定制版本.这个版本中通过增加最少的类使在Android应用中编写响应式组件简单而且无障碍,特别之处在与它还提供了一个Scheduler,可以在主线程 ...

  6. 我的Android进阶之旅------&gt;Android字符串资源中的单引號问题error: Apostrophe not preceded by 的解决的方法

    刚刚在string字符串资源文件里,写了一个单引號.报错了,错误代码例如以下 error: Apostrophe not preceded by \ (in OuyangPeng's blog ) 资 ...

  7. jquery下载保存文件

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  8. Android源码-SignApk.java

    /* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Versi ...

  9. Python进阶---python strip() split()函数实战(转)

    先看一个例子: >>> ipaddr = 10.122.19.10 File "", line 1 ipaddr = 10.122.19.10 ^ SyntaxE ...

  10. Visual studio之C# 重新定义Messbox的显示窗口位置

    背景 当前做的APP需要新建一个设置窗口,该设置窗口会出现在靠近屏幕边缘位置,但主窗口铺满屏幕,设置窗口会弹出一些讯息,但默认情况下Messagebox窗口会居中于主窗口,这不太符合要求,正常应该居中 ...