給出乙個 $n$ 個頂點 $m$ 條邊的圖,要求阻塞一些邊,使得從 $1$ 到 $n$ 的最短路變長,求阻塞的邊長度和的最小值,不必保證阻塞後可達。
很顯然,要阻塞的邊肯定在最短路圖上,先跑一遍單源最短路,求出最短路圖。
要使最短路變長,肯定要同時切斷原有的所有最短路,又要是長度(相當於流量)和最小,很容易想到就是求最小割。
簡而言之,就是在最短路圖上求最小割。
兩個模板拼起來就好了(難得寫抄這麼長的能一遍ac)
#includeusingnamespace
std;
typedef
long
long
ll;const ll inf = 1ll << 60
;const
int inf2 = 0x3f3f3f3f
;const
int maxv = 10000+10; //
最大頂點數
const
int maxn =maxv;
const
int maxe = 10000+10; //
最大邊數
ll dis[maxv];
intcnt[maxv];
bool inq[maxv]; //
記錄是否在隊中
int head[maxv], id; //
head2[maxv], cnt2;
intn, m;
struct
edge
edge[maxe];
inline
void
init()
inline
void addedge(int u, int v, int w, int
id)bool spfa(int
s) }}}
}return
true;}
struct
edge2
};struct
edmondskarp
void addedge(int
from, int to, int
cap)
ll maxflow(
int s, int
t)
}if(a[t]) break
; }
if(!a[t]) break
;
for(int u = t; u != s;u=edges[p[u]].from
)
flow +=a[t];
}return
flow;
}}ek;
intmain()
spfa(1);
ek.init(n);
for(int i = 1;i <= n;i++)
}printf(
"%lld\n
", ek.maxflow(1
, n));
}return0;
}
2019HDU多校 Path 最短路轉最小割
hdu6852 之前見過類似的題,所以寫起來很輕鬆 因為要讓最短路邊長,所以可以先跑最短路 滿足d is u dis v d i w dis u dis v d i w dis u di s v d i w的邊就是最短路邊 這些最短路邊形成一張網路 在上面跑最小割,代表的就是割斷每一條最短路 inc...
2019HDU多校第7場 構造
假設現在你在準備考試,明天的考試有 n 道題目,對於分值為 i 的題目至少複習 i 1 小時才能做對,已知總分為 m 求確保完成 k 道題的最少時間。手動嘗試一下,發現答案都是 aabbbb 這樣的形式。例如,5 18 3 rightarrow 6 6 7 7 7,5 19 3 rightarrow...
2019HDU多校 6223 (最小質因子指數冪)
傳送門 題解 考慮先篩出1e4 1e41e 4以內的素數,對於每個輸入的 n nn 先除掉 1e4 1e41e 4 以內的素因子 如果存在的話 並且更新答案。如果除完後n nn 還大於1,說明存在大於1e4 1e41e 4的素因子,而且這些素因子的最多隻會有4 44次方,因為更大的話就會超過 1 e...