打完比賽,請教大佬,大佬口胡講解。
於是有了下面的**,(邊權和超過int,wa了兩發)
#include
using
namespace std;
// 優化解釋的**
const
int n =
20000
;const
int inf =
0x7fffffff
;const
long
long inf =
0x7fffffffffff
;struct edge1};
//可判重邊
struct isap
}void
addedge
(int from,
int to,
int cap)
void
bfs(
)//逆向進行bfs}}
}int
augumemt()
x=t;
while
(x!=s)
//增廣
//s[s] = 1;
return a;
}int
maxflow
(int s,
int t)
//根據情況前進或者後退,走到匯點時增廣
// cout
//是否可以前進
for(
int i=cur[x]
;i.size()
;i++
)//cur 從上次處理的弧下標開始 當前弧優化}if
(!ok)
//走不動了,撤退if(
--num[d[x]]==
0)break
;//如果走不動了,且這個距離值原來只有乙個,那麼s-t不連通,這就是所謂的「gap優化」
num[d[x]
=m+1]++
;//更新距離 更新距離數量
cur[x]=0
;//當前弧清零
if(x!=s)
x=edges[p[x]
].from;
//退一步,沿著父邊返回}}
return flow;
}}isap;
const
int maxn =
2e4;
//頂點數量
typedef pair <
long
long
,int
> pii;
struct edge };
struct dijkstra
edges.
clear()
;}void
addedge
(int u,
int v,
int d)
void
dijkstra
(int s)}}
}}dijks,dijkt;
int t;
int n, m;
intmain()
dijks.
dijkstra(1
);dijkt.
dijkstra
(n);
long
long mindis = dijks.d[n]
;//cout
(int i =
0; i < dijks.edges.
size()
; i++)}
//cout
maxflow(1
, n)
;printf
("\n");
}return0;
}
hdu 6582 path 最短路 最小割
題意 有n個點,m條單向帶權邊,起點為1,終點為n,如果開始沒有最短路輸出0,現在想堵住一些路,使堵之後的最短路值變大,或不存在。堵路的花費就是邊的權值,問最小花費。思路 找到最短路核心邊,再重新建邊,跑一遍最小割即可。找最短路核心邊要正向建邊找每點到起點的距離 假設為d i 再反向建邊找每點到終點...
HDU 6582 Path 最短路 最大流
題目大意 給出一張 n 個點和 m 條邊組成的有向圖,現在問讓最短路變長的最小花費是多少 題目分析 增加最短路的最小花費,我們可以將最短路上的邊單獨拿出來,再求一下最小割就好了,用了封裝後的演算法看起來非常舒服,但時間複雜度有點高。看別人都是100ms左右跑完,我的 是950ms劃過 include...
2019HDU多校Path 最短路最小割
給出乙個 n 個頂點 m 條邊的圖,要求阻塞一些邊,使得從 1 到 n 的最短路變長,求阻塞的邊長度和的最小值,不必保證阻塞後可達。很顯然,要阻塞的邊肯定在最短路圖上,先跑一遍單源最短路,求出最短路圖。要使最短路變長,肯定要同時切斷原有的所有最短路,又要是長度 相當於流量 和最小,很容易想到就是求最...