題目描述
給定一張有向圖,每條邊都有乙個容量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...