hdu3667 最小費用流 拆邊題

2021-08-04 21:51:07 字數 1317 閱讀 3970

第一道拆邊題  用bellman-ford以967ms險過...

先說一下大體的題意:輸入n m k 分別指城市的個數 m條邊 現在需要把k個單位的物品從城市1運往城市n

接下來的m行  每一行輸入四個數 u

i, v

i, a

i, ci 

代表從城市u到城市v有一條單向路 容量為c 如果在這條路上運送x個單位的物品 需要花費a*x*x的費用 

求最小費用 若不能成功將這k個物品運輸到城市n 輸出-1

思路:拆邊 m條邊  對於每一條邊 每條邊都可以分成c條邊

這c條邊 容量都為1 花費為 1a  3a 5a 7a 最多到9a(因為c最大是5)

如果流量為1 就會走第一條邊 花費a*1*1的費用

如果流量為2 就會走第一條和第二條邊  花費為1a+3a == a*2*2

同理依次類推

#include#include#include#include#include#include#include#include#include#include#include#include#includetypedef long long ll;

using namespace std;

#define mv 11000 //max number of node

#define inf 0x3f3f3f3f

struct edge;};

vector g[mv];

int dis[mv];//the distance from source

int prevv[mv], preve[mv];//the previous node and the previous edge

int min_cost_flow(int v,int s, int t, int f)}}

}if(dis[t] == inf)

return -1;

int d = f;

for(i = t; i != s; i = prevv[i])

d = min(d, g[prevv[i]][preve[i]].cap);

ans += d * dis[t];

f -= d;

for(i = t; i != s; i = prevv[i])

}return ans;

}void addedge(int s1,int t1,int cap,int cost)

int main()

{

int n,m,k;

int i;

while(scanf("%d%d%d",&n,&m,&k)==3)

{for(i=0;i

hdu 3667(拆邊 最小費用最大流)

思路 由於花費的計算方法是a x x,因此必須拆邊,使得最小費用流模板可用,即變成a x的形式。具體的拆邊方法為 第i次取這條路時費用為 2 i 1 a i 5 每條邊的容量為1。如果這條邊通過的流量為x,那正好sigma 2 i 1 1 1 include2 include3 include4 i...

最小費用最大流 hdu 3667

學了好幾天了,終於生成了模板 一直以來有乙個問題沒有克服,今天終於想明白了,那就是為什麼要加反向流量呢?那是因為如果你在加流量的時候如果加多了,則要溜回去。include include include include includeusing namespace std const int max...

最小費用最大流(拆邊)

題目大概意思是,有n個城市m條邊,要從1城市到n城市運送k的物品,求最少花費,每個邊有乙個係數ai花費的錢是ai 這條邊上運送物資數的平方,比如在係數為3的邊上運送了2的物品,則需要3 2 2的花費 思路 由於每條邊的容量不超過5,所以可以把每一條邊拆成容量條流量為1的邊,他們的花費分別為1 ai,...