2019HDU多校 Path 最短路轉最小割

2021-10-09 10:59:21 字數 1243 閱讀 1711

hdu6852

之前見過類似的題,所以寫起來很輕鬆

因為要讓最短路邊長,所以可以先跑最短路

滿足d is

[u]=

=dis

[v]+

d[i]

.w

dis[u]==dis[v]+d[i].w

dis[u]

==di

s[v]

+d[i

].w的邊就是最短路邊

這些最短路邊形成一張網路

在上面跑最小割,代表的就是割斷每一條最短路

#include using namespace std;

#define int long long

const int maxn=4e5+10;

const int inf =1e18;

struct edged[maxn],d1[maxn];

int head[maxn],cnt=1;

int head1[maxn],cnt1=1,n,m,s,t;

void add( int u,int v,int flow)

,head[u]=cnt;

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

}void addone(int u,int v,int w)

,head1[u]=cnt1;

}int gap[maxn],deep[maxn];

bool bfs()

}}int isap(int u,int flow)

}if( --gap[deep[u]]==0 ) deep[s]=t+1;//斷層

deep[u]++;

gap[deep[u]]++;

return flow-res;

}int dis[maxn],vis[maxn];

void spfa()}}

}signed main()

spfa();

for( int i=1;i<=n;i++)

for(int j=head1[i];j;j=d1[j].nxt )

int ans=0;

bfs();

while( deep[s]ans+=isap(s,inf);

cout << ans << '\n';

cnt=cnt1=1;

for(int i=0;i<=t;i++) head[i]=head1[i]=0;

}}

2019HDU多校Path 最短路最小割

給出乙個 n 個頂點 m 條邊的圖,要求阻塞一些邊,使得從 1 到 n 的最短路變長,求阻塞的邊長度和的最小值,不必保證阻塞後可達。很顯然,要阻塞的邊肯定在最短路圖上,先跑一遍單源最短路,求出最短路圖。要使最短路變長,肯定要同時切斷原有的所有最短路,又要是長度 相當於流量 和最小,很容易想到就是求最...

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...