P2604 ZJOI2010 網路擴容

2022-05-08 02:27:06 字數 1557 閱讀 9991

給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求: 1、 在不擴容的情況下,1到n的最大流; 2、 將1到n的最大流增加k所需的最小擴容費用。

輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數、邊數以及所需要增加的流量。 接下來的m行每行包含四個整數u,v,c,w,表示一條從u到v,容量為c,擴容費用為w的邊。

輸出檔案一行包含兩個整數,分別表示問題1和問題2的答案。

輸入 #1複製

5 8 2

1 2 5 8

2 5 9 9

5 1 6 2

5 1 1 8

1 2 8 7

2 5 4 9

1 2 1 1

1 4 2 1

輸出 #1複製

13 19

30%的資料中,n<=100

100%的資料中,n<=1000,m<=5000,k<=10

有點暴力。先跑一遍dinic,求出第一問的解,再重新建圖,講擴容記為容量inf,費用的邊,最後新建t點,容量為maxflow+k,跑最大流最小費用,即可得到ans。

#include#define n 10700

#define m 107000

#define inf 1<<29

using

namespace

std;

struct

nodee[m*2

];int tot=1,head[n],maxflow=0,ans=0

;int

x[m],y[m],z[m],cost[m];

intn,m,s,t,k;

void add(int x,int y,int z,int

p)int

incf[n],v[n],pre[n],d[n];

queue

q;bool

bfs()} }

return0;

}int dinic(int x,int

flow)

}return flow-rest;

}bool

spfa()}}

if(d[t]==0x3f3f3f3f) return

false;//

0xcfcfcfcf

return

true;}

void

update()

maxflow+=incf[t];

ans+=d[t]*incf[t];

}void

rebuild()

add(n,n+1,maxflow+k,0);}

intmain()

s=1;t=n;

while

(bfs())

while(flow=dinic(s,inf)) maxflow+=flow;

cout

<"";

rebuild();

while

(spfa()) update();

cout

return0;

}

洛谷P2604 ZJOI2010 網路擴容

題目大意 給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1.在不擴容的情況下,1到n的最大流 2.將1到n的最大流增加k所需的最小費用。題解 先跑最大流,在殘餘網路上跑費用流 卡點 無 c code include include include ...

ZJOI2010 網路擴容

題目描述 給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。輸入格式 輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數 邊數以及所需要增加的流量。接下來的m行每...

ZJOI2010 網路擴容

最大流 費用流 洛谷位址 第一問就直接跑最大流。第二問目前有兩種方法 include include include include using namespace std define inf 0x7fffffff int n,m,k,s,t struct edgee 100005 int fir...