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

2021-09-08 21:59:09 字數 1130 閱讀 7394

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

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define maxn 222

8#define maxm 22222222

9#define inf 1<<30

1011

struct

edgeedge[maxm];

1415

intn,m,k,ne;

16int

head[maxn];

1718

void insert(int u,int v,int cap,int

cost)

1932

33int

dist[maxn];

34bool

mark[maxn];

35int

cur[maxn],pre[maxn];

36bool spfa(int vs,int

vt)3757}

58}59}

60return dist[vt]

6263

int mincostflow(int vs,int

vt)64

71 flow+=aug;cost+=dist[vt]*aug;

72for(int u=vt;u!=vs;u=pre[u])76}

77if(flow1;78

return

cost;79}

8081

intmain()

8292

}93 insert(0,1,k,0

);94 printf("

%d\n

",mincostflow(0

,n));95}

96return0;

97}9899

100101

view code

hdu3667 最小費用流 拆邊題

第一道拆邊題 用bellman ford以967ms險過.先說一下大體的題意 輸入n m k 分別指城市的個數 m條邊 現在需要把k個單位的物品從城市1運往城市n 接下來的m行 每一行輸入四個數 u i,v i,a i,ci 代表從城市u到城市v有一條單向路 容量為c 如果在這條路上運送x個單位的物...

最小費用最大流 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,...