ZJOI2010 網路擴容

2021-08-13 20:21:50 字數 1582 閱讀 9366

題目描述

給定一張有向圖,每條邊都有乙個容量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 裸的最大流

問題2 在殘量網路上直接增加擴容邊,然後在建乙個新的s連向之前的s,容量為新增的。

(如果不在殘量網路上增加擴容邊可能會出事情),因為你最大流增加k後的最大流方案不再是之前那個了。

所以我覺得如果算出最大流以後重建圖,在加乙個最大流+k的邊應該也能跑過?

#include

using

namespace

std;

const

int maxn=1e5+5;

const

int inf=1e9+7;

int n,m,k,s,t;

struct edgee[maxn<<1],e2[maxn<<1];

int head[maxn],cur[maxn],cnt=1;

inline

void add1(int u,int v,int w,int cost),head[u]=cnt;

e[++cnt]=(edge),head[v]=cnt;

}int head2[maxn],cnt2=1;

inline

void add2(int u,int v,int w,int cost),head2[u]=cnt2;

} queue

q;int dep[maxn];

bool bfs(int x)}}

if(!dep[t])return

0; return

1; }

int dfs(int u,int flow)}}

return0;}

int dinic()

return ans;

}bool vis[maxn];

int dis[maxn],pre[maxn];

bool spfa(int x)

}}

}if(dis[t]==inf)return

0; return1;}

int flow=0;

int mc()

for(int i=pre[t];i;i=pre[e2[i].u])

flow+=tem;

}return ans;

}int rongliang[maxn];

int main()

printf("%d ",dinic());

for(int i=2;i<=cnt;i+=2)

t++;

add2(t-1,t,k,0);

printf("%d\n",mc());

return

0;}

ZJOI2010 網路擴容

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

zjoi2010 網路擴容

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

ZJOI2010 網路擴容 費用流

給定一張有向圖,每條邊都有乙個容量 c 和乙個擴容費用 w 這裡擴容費用是指將容量擴大 1 所需的費用。求 在不擴容的情況下,1 到 n 的最大流 將 1 到 n 的最大流增加 k 所需的最小擴容費用。先求出原圖的最大流,大小設為 f 對於原圖中的每條邊 u,v,w 我們連邊 u,v,w,0 和 u...