SGU 185.Two shortest (最小费用最大流)
时间限制:0.25s
空间限制:4M
题意:
在n(n<=400)个点的图中,找到并输出两条不想交的最短路。不存在输出“No sulotion”;
Solution:
最小费用最大流
建图与poj 2135 一样,添加S到1的流量为2权为0,n到T的流量为2权为0的边,其它边的流量为1,权为路径长度.
但是这道题麻烦不在要输出最短路,而在仅仅4M的内存上。
由于只有4M,我们最多存上400*400条边.但是图却是一个无向图,朴素的想法是存上400*400*2条边,但是这里内存不够.
所以我们首先要确定记录一条边我们是否使用过,如果使用了使用的是那个方向.
相应的在找到增广路后,把正向反向边的流量改变,把反向边的费用变成负值.
最后按照我们标记过的边dfs,并输出就好了.
总的来说是一道足以加深对最小费用最大流的理解的不错的题!
参考代码:
/*
最小费用最大流算法:
思路:
以费用为权做最短路算法。
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
const int INF = , Maxn = 0x3f3f3f3f; struct node {
int u, v, t, c, next;
} edge[INF * INF];
int head[INF], nCnt = ;
int G[INF][INF];
void addEdge (int u, int v, int traffic, int cost) {
edge[++nCnt].v = v, edge[nCnt].u = u, edge[nCnt].t = traffic, edge[nCnt].c = cost;
edge[nCnt].next = head[u], head[u] = nCnt;
edge[++nCnt].v = u, edge[nCnt].u = v, edge[nCnt].t = traffic, edge[nCnt].c = cost;
edge[nCnt].next = head[v], head[v] = nCnt;
}
int max_flow, min_cost;
int n, m, SS, ST, S, T, min_dis = Maxn;
int SPFA() {
queue<int> ql;
int vis[INF] = {}, dis[INF], pre[INF] = {};
ql.push (SS);
memset (dis, 0x3f, sizeof dis);
vis[SS] = , dis[SS] = ;
while (!ql.empty() ) {
int x = ql.front(); ql.pop();
for (int i = head[x]; i != ; i = edge[i].next) {
if (edge[i].t == ) continue;
int v = edge[i].v, c = edge[i].c;
if (dis[v] > dis[x] + c) {
dis[v] = dis[x] + c;
pre[v] = i;
if (!vis[v])
ql.push (v), vis[v] = ;
}
}
vis[x] = ;
}
min_dis = min (min_dis, dis[ST]);
if (dis[ST] == Maxn) return ;
else {
min_cost += dis[ST];
int k = pre[ST];
int cur_flow = Maxn;
while (k) {
if (cur_flow > edge[k].t) cur_flow = edge[k].t;
G[edge[k].u][edge[k].v] = G[edge[k].v][edge[k].u] = ^ G[edge[k].v][edge[k].u];
edge[k].t = edge[k ^ ].t, edge[k].c = abs (edge[k].c);
edge[k ^ ].t = , edge[k ^ ].c = -abs (edge[k ^ ].c);
k = pre[edge[k].u];
}
max_flow += cur_flow;
k = pre[ST];
while (k) {
edge[k].t -= cur_flow, edge[k ^ ].t += cur_flow;
k = pre[edge[k].u];
}
return ;
}
}
void dfs (int x) {
for (int i = head[x]; i != ; i = edge[i].next) {
if (G[x][edge[i].v] && edge[i].t > && edge[i].v < T) {
edge[i].t = ;
dfs (edge[i].v);
break;
}
}
if (x == S) printf ("%d", x);
else
printf (" %d", x);
}
int MCMF() {
while (SPFA() );
if (max_flow == && min_cost == * min_dis) {
dfs (T);
putchar ();
dfs (T);
}
else
puts ("No solution");
}
void build() {
scanf ("%d %d", &n, &m);
int x, y, z;
for (int i = ; i <= m; i++) {
scanf ("%d %d %d", &x, &y, &z);
addEdge (x, y, , z);
}
S = , T = n;
SS = n + , ST = n + ;
addEdge (SS, S, , ), addEdge (T, ST, , );
}
int main() {
build();
MCMF();
return ;
}
SGU 185.Two shortest (最小费用最大流)的更多相关文章
- SGU 185 Two shortest 最短路+最大流
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21068 Yesterday Vasya and Petya qua ...
- TZOJ 4712 Double Shortest Paths(最小费用最大流)
描述 Alice and Bob are walking in an ancient maze with a lot of caves and one-way passages connecting ...
- CSU 1506 Problem D: Double Shortest Paths(最小费用最大流)
题意:2个人从1走到n,假设一条路第一次走则是价值di,假设第二次还走这条路则须要价值di+ai,要你输出2个人到达终点的最小价值! 太水了!一条边建2次就OK了.第一次价值为di,第二次为ai+di ...
- POJ 2516 最小费用最大流
每一种货物都是独立的,分成k次最小费用最大流即可! 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E[pe[v]^ ...
- 网络流(最小费用最大流):POJ 2135 Farm Tour
Farm Tour Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: ...
- UVa 10806 Dijkstra,Dijkstra(最小费用最大流)
裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...
- TZOJ 1513 Farm Tour(最小费用最大流)
描述 When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 &l ...
- POJ 2135 Farm Tour (网络流,最小费用最大流)
POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...
- POJ 2135 Farm Tour(最小费用最大流)
Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...
随机推荐
- Linux下如何挂载FAT32格式USB设备
挂u盘之前,运行命令cat /proc/partitions,看看现在系统中有哪些分区.插上u盘以后,再次运行上述命令,看看多出来什么分区.通常是sda1. 1.插入U盘 2.输入 fdisk -l ...
- 成为Web开发人员的7个简单步骤
你想成为一名 Web 开发人员,但现在你面前有这样一个问题,那就是你没有在高科技行业工作的经验.你上了一些课程,也花了时间在个人编码项目上,但是你的简历上关于“经验”的部分仍然不为企业承认.过渡到一个 ...
- TSSAO Temporal Screen-Space Ambient Occlusion (Unity3d 5 示例实现)
前提 环境光(ambient occlusion)是一种GI,其简化形式SSAO可以用“微量高效”来形容,消耗得很少,得到的效果很好.环 境光遮蔽(ambient occlusion)的本质是计算在一 ...
- Jdk5.0新特性
增强for循环:foreach语句,foreach简化了迭代器. 格式:// 增强for循环括号里写两个参数,第一个是声明一个变量,第二个就是需要迭代的容器 for( 元素类型 变量名 : Colle ...
- php 下载
$file='url.xlsx'; if (file_exists(EA_DIR_DATA . $file)) { header('Content-Description: Fi ...
- 在world2013中插入GB_2312
文字添加方法: 1.下载字体并解压 2.开始中打开控制面板 3.在控制面板中打开字体文件夹 4.把下载的字体复制到此文件下 5.文字添加完成.
- firefox如何restart重启
1.开发者工具栏可以对firefox进行重启,不是关闭firefox又打开那种重启
- jQuery选择器总结 转
jQuery选择器总结 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3 ...
- UVa1607 poj1435 UVaLive1686 Gates
填坑系列(p.246) 由函数连续性得满足二分性 #include<cstdio> #include<cstring> #include<cstdlib> #inc ...
- android开发之service详解
service作为android的四大组件之一,其重要性可想而知,在开发中,我们经常把一些不需要与用户进行交互的工作放在service中来完成,service运行在后台,这样有些人可能会产生错觉,以为 ...