dis

网络流-最小费用最大流

为君一笑 提交于 2019-11-26 18:17:21
定义 有时,网络中每条边除了容量还有费用。最小费用最大流(MincostMaxflow,简称MCMF)就是在最大流的基础上,费用最小。 实现 和EK类似,最小费用最大流的求法也是暴力寻找增广路,但是不是用Bfs进行增广,而是用Bellman-Ford或者Spfa进行增广。寻找增广路时,先要满足可以增广,然后检查费用是否更优秀,两者都满足,才修正。这样增广下来,不难发现肯定满足费用最小。 这个算法的效率是玄学……但是实际运用中应该可能大概够了吧。 模板 实在没找到模板题,用 POJ2135 当模板题好了。 因为每条道路只能通过一次,所以我们可以认为每条道路的容量为1,费用为这条道路的长度(由于这道题是双向边,所以必须正反都建边)。但是要走回来怎么办?因为不能重复走,所以走回来就等价于走两次(已双向建边),我们可以增加两个虚拟节点0和n+1:0向1构造一条容量为2,费用为0的边,n向n+1构造一条容量为2,费用为0的边。然后直接刷最小费用最大流即可。 #include<cstdio> #include<cstring> #include<algorithm> using namespace std ; const int maxn= 1000 ,maxm= 40000 ; int n,m,E,lnk[maxn+ 5 ],son[maxm+ 5 ],nxt[maxm+ 5 ]; int

GDOI#348大陆争霸[SDOI2010]最短路有限制条件

☆樱花仙子☆ 提交于 2019-11-26 18:11:22
在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国。两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林·布拉泽。 幻想历 8012年 1月,杰森国正式宣布曾·布拉泽是他们唯一信仰的神,同 时开始迫害在杰森国的信仰斯普林·布拉泽的克里斯国教徒。 幻想历 8012年 3月2日,位于杰森国东部小镇神谕镇的克里斯国教徒发动 起义。 幻想历 8012年 3月7日,神谕镇的起义被杰森国大军以残酷手段镇压。 幻想历 8012年 3月8日,克里斯国对杰森国宣战。由数十万大军组成的克 里斯军团开至两国边境,与杰森军团对峙。 幻想历 8012年 4月,克里斯军团攻破杰森军团防线进入神谕镇,该镇幸存 的克里斯国教徒得到解放。 战争随后进入胶着状态,旷日持久。战况惨烈,一时间枪林弹雨,硝烟弥漫, 民不聊生。 幻想历 8012年 5月12日深夜,斯普林·布拉泽降下神谕:“Trust me, earn eternal life.”克里斯军团士气大增。作为克里斯军团的主帅,你决定利用这一机 会发动奇袭,一举击败杰森国。 【题目描述】 杰森国有 N 个城市,由 M条单向道 路连接。神谕镇是城市 1而杰森国的首都是城市 N。你只需摧毁位于杰森国首都 的曾·布拉泽大神殿,杰森国的信仰,军队还有一切就都会土崩瓦解,灰飞烟灭。

【JLOI2011】飞行路线

亡梦爱人 提交于 2019-11-26 12:46:00
题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在 n n个城市设有业务,设这些城市分别标记为 0 0到 n-1 n − 1,一共有 m m种航线,每种航线连接两个城市,并且航线有一定的价格。 Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多 k k种航线上搭乘飞机。那么Alice和Bob这次出行最少花费多少? 输入格式 数据的第一行有三个整数, n,m,k n , m , k,分别表示城市数,航线数和免费乘坐次数。 第二行有两个整数, s,t s , t,分别表示他们出行的起点城市编号和终点城市编号。 接下来有m行,每行三个整数, a,b,c a , b , c,表示存在一种航线,能从城市 a a到达城市 b b,或从城市 b b到达城市 a a,价格为 c c。 输出格式 只有一行,包含一个整数,为最少花费 输入 #1 5 6 1 0 4 0 1 5 1 2 5 2 3 5 3 4 5 2 3 3 0 2 100 输出 #1 8 【解题思路】 分层图模板题 我们将每个点拆成k个,这样子在路径上就能够表现出,选择简化这个点到另外一个点的路径对结果的影响 因为刚好是k层,所以能够优化的路径也就至多只有k层,保证了选择k条路径的前提 有点 u ,v ,令第 j

最短路总结

大兔子大兔子 提交于 2019-11-26 10:28:34
---恢复内容开始--- 看到的结论:E是边数,n是点数量。 Dijkstra(迪杰斯特拉): 适用于权值为非负的图的单源最短路径,优先队列优化 O(E+nlgn) SPFA: 适用于权值有负值,且没有 负环 的图的单源最短路径,SPFA的最坏情况是O(Vn). Floyd(弗洛伊德):任意两点 之间的最短路径。O(n^3) 给出结论: (1)单源最短路,当权值为 非负 时,用Dijkstra,。 (2)单源最短路,当权值有负值,且没有负环,则用SPFA,SPFA能检测负圈,但是不能输出负圈。 (3)数据小,无负环,任意两点之间的距离。弗洛伊德 弗洛伊德 二 迪杰斯特拉 朴实无华迪杰斯特拉 #define inf 0x3f3f3f3f const int N = 100; int ma[N][N]; int vis[N], dis[N], ne[N]; void dijkstra(int u){ memset(dis, inf, sizeof(dis)); memset(vis, 0, sizeof(vis)); int st = u; for(int i = 1; i <= n; i++){ dis[i] = min(dis[i], ma[st][i]); } for(int i = 1; i < n; i++){ int mi = inf; for(int j = 1; j <