HDU 6582 Path 最短路 最大流

2021-10-07 14:18:44 字數 1425 閱讀 3801

題目大意:給出一張 n 個點和 m 條邊組成的有向圖,現在問讓最短路變長的最小花費是多少

題目分析:增加最短路的最小花費,我們可以將最短路上的邊單獨拿出來,再求一下最小割就好了,用了封裝後的演算法看起來非常舒服,但時間複雜度有點高。。看別人都是100ms左右跑完,我的**是950ms劃過

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef unsigned long long ull;

const ll inf=0x3f3f3f3f3f3f3f3f;

const int n=1e4+100;

templatestruct dinic

edge[m];//邊數

int head[n],cnt;

void addedge(int u,int v,t w)

int d[n],now[n];//深度 當前弧優化

bool bfs(int s,int t)//尋找增廣路

}return false;

}

t dinic(int x,int t,t flow)//更新答案

}now[x]=i;

return flow-rest;

}

void init()

t solve(int st,int ed) };

templatestruct dij

edge[m];

int head[n],cnt;//鏈式前向星

t d[n];

bool vis[n];

void addedge(int u,int v,t w)

struct node

bool operator<(const node& a)const

};void dijkstra(int st)

}} }

void init() };

dinict;

dijd1,d2;

int main()

d1.dijkstra(1);

d2.dijkstra(n);

if(d1.d[n]==inf)

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

for(int j=d1.head[i];j!=-1;j=d1.edge[j].next)

t.addedge(st,1,inf);

t.addedge(n,ed,inf);

printf("%lld\n",t.solve(st,ed));

} return 0;

}

hdu 6582 path 最短路 最小割

題意 有n個點,m條單向帶權邊,起點為1,終點為n,如果開始沒有最短路輸出0,現在想堵住一些路,使堵之後的最短路值變大,或不存在。堵路的花費就是邊的權值,問最小花費。思路 找到最短路核心邊,再重新建邊,跑一遍最小割即可。找最短路核心邊要正向建邊找每點到起點的距離 假設為d i 再反向建邊找每點到終點...

hdu 6582 最短路 最小割)

打完比賽,請教大佬,大佬口胡講解。於是有了下面的 邊權和超過int,wa了兩發 include using namespace std 優化解釋的 const int n 20000 const int inf 0x7fffffff const long long inf 0x7ffffffffff...

最短路徑 path

題目描述 給出一張包含n個節點m條邊的無向圖,請你求出圖上兩點s,t間的最短路徑長度 請大家自行處理重邊和自環 輸入 第一行兩個數n,m,分別表示節點數和邊數,以空格隔開。之後m行,每行3個數u,v,w,表示點u和v間有一條權值為w的邊。最後一行,兩個數s,t表示選擇的兩個點,以空格隔開。輸出 輸出...