題目大意:給出一張 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表示選擇的兩個點,以空格隔開。輸出 輸出...