題意:
給你乙個有向圖,問你從1到n的最大流是多少?如果流量大於等於c那麼直接輸出乙個串,否則輸出只擴充一條邊的流量就可以達到1->n大於等於c的所有邊,如果擴充不了就
輸出另乙個串。
sample input
4 4 5
1 2 5
1 3 5
2 4 5
3 4 5
4 4 5
1 2 1
1 3 5
2 4 5
3 4 1
4 4 5
1 2 1
1 3 1
2 4 1
3 4 1
0 0 0
output for sample input
case 1: possible
case 2: possible option:(1,2),(3,4)
case 3: not possible
思路:很容易想到的一點就是擴充套件後有作用的點肯定是割邊,那麼我們可以先跑一遍最大流把割邊找出來,然後列舉割邊,擴充割邊流量,看最大流是否大於等於c,但是這樣會tle,有兩個比較有用的優化,就是每次都在殘餘網路上改流量,然後加上殘餘網路之前跑出來的流量,還有乙個優化就是跑最大流的時候,如果當前流量大於等於c了就已經滿足了,沒必要再跑了。
#include
#include
#include
#include
#define n_node 100 + 5
#define n_edge 20000 + 10
#define inf 2005000000
using namespace std;
typedef struct
star;
typedef struct
dep;
typedef struct
edge;
star e[n_edge] ,mke[n_edge];
edge edge[n_edge] ,ans_edge[n_edge];
dep xin ,tou;
int list[n_node] ,list2[n_node] ,mklist[n_node] ,tot;
int deep[n_node];
void add(int a ,int b ,long long c)
bool camp(edge a ,edge b)
long long minn(long long a ,long long b)
bool bfs_deep(int s ,int t ,int n)
}for(int i = 0 ;i <= n ;i ++)
list2[i] = list[i];
return deep[t] != -1;
}long long dfs_flow(int s ,int t ,long long flow ,long long c)
if(!nowflow) deep[s] = 0;
return nowflow;
}long long dinic(int s ,int t ,int n ,long long c)
return ans;
}int main ()
long long ans = dinic(1 ,n ,n ,c);
printf("case %d: " ,cas ++);
if(ans >= c)
int nowid = 0;
for(i = 2 ;i <= tot ;i += 2)
}for(i = 1 ;i <= n ;i ++)
mklist[i] = list[i];
int ans_id = 0;
int mktot = tot;
for(i = 1 ;i <= nowid ;i ++)
if(!ans_id)
sort(ans_edge + 1 ,ans_edge + ans_id + 1 ,camp);
printf("possible option:");
for(i = 1 ;i <= ans_id ;i ++)
if(i != 1) printf(",(%d,%d)" ,ans_edge[i].a ,ans_edge[i].b);
else printf("(%d,%d)" ,ans_edge[i].a ,ans_edge[i].b);
puts("");
}return 0;
}
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...
bzoj1834 網路擴容
給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數 邊數以及所需要增加的流量。接下來的m行每行包含四個整數u,v...