最大流 USTC1280
挺有意思的一题,最小路径之后最大流
/**************************************************************
作者:陈新
邮箱:cx2pirate@gmail.com
用途:ustc1280.cpp(图)
时间:2014 4月17日 21:55
测试:未验证
思路:先求最短路径,根据dis[v] = dis[u] + dis(u,v)获得包含最短路径所有边的一个子图(可能还包括
了其他边,根据最大流最小割,再求最大流就是最小代价。
*************************************************************/ #include <cstdio>
#include <memory.h>
#include <stack>
#include <vector>
#include <queue> #define MAXV 1005 //最大定点数
#define MAXE 10005 //最大边数
#define MAX_INT 0x7fffffff using namespace std; typedef struct{
int v,c,w,next;
}EDGE; int n,m,sour,dest,nEdge;
EDGE map1[MAXE]; //map1保存原图,map2保存map1中最短路径上的所有边
int head[MAXV];
int map2[MAXV][MAXV];
int dis[MAXV];
bool inQue[MAXV];
bool vis[MAXV];
int pre[MAXV]; void addEdge(int u,int v,int w,int c);
void spfa();
void init();
void traceRoute();
bool bfs();
int dicnic();
int update(); int main(){
int cnt = 1;
while(scanf("%d%d",&n,&m) && !(n == 0 && m == 0)){
init(); scanf("%d%d",&sour,&dest); int u,v,w,c;
for(int i = 0;i < m;i++){
scanf("%d%d%d%d",&u,&v,&w,&c);
addEdge(u,v,w,c);
addEdge(v,u,w,c);
} spfa();
traceRoute();
int cost = dicnic();
printf("Case %d: %d\n",cnt++,cost);
}
return 0;
} int dicnic(){
int sum = 0;
while(bfs()){
sum += update();;
}
return sum;
} bool bfs(){
for(int i = 1;i <= n;i++){
vis[i] = false;
pre[i] = -1;
} queue<int> que;
que.push(sour);
vis[sour] = true; while(!que.empty()){
int u = que.front();
que.pop(); if(u == dest){
return true;
} for(int v = 1;v <= n;v++){
if(!vis[v] && map2[u][v] > 0){
vis[v] = true;
que.push(v);
pre[v] = u;
}
}
}
return false;
} int update(){
int v = dest;
int min = MAX_INT;
while(pre[v] != -1){
min = min < map2[pre[v]][v] ? min : map2[pre[v]][v];
v = pre[v];
}
v = dest;
while(pre[v] != -1){
map2[pre[v]][v] -= min;
map2[v][pre[v]] += min;
v = pre[v];
}
return min;
} void traceRoute(){ //有不是最短路径的边也被添加到新图中,但对最小割无关紧要
memset(vis,false,sizeof(vis));
queue<int> que;
que.push(sour);
vis[sour] = true; while(!que.empty()){
int u = que.front();
que.pop(); int i = head[u];
while(i != -1){
EDGE e = map1[i];
if(dis[e.v] == dis[u] + e.w){
map2[u][e.v] += e.c;
if(!vis[e.v]){
que.push(e.v);
vis[e.v] = true;
}
}
i = e.next;
}
}
} void addEdge(int u,int v,int w,int c){
map1[nEdge].v = v;
map1[nEdge].w = w;
map1[nEdge].c = c;
map1[nEdge].next = head[u];
head[u] = nEdge++;
} void spfa(){
queue<int> que;
que.push(sour);
inQue[sour] = true;
dis[sour] = 0; while(!que.empty()){
int u = que.front();
que.pop();
inQue[u] = false; int i = head[u];
while(i != -1){
EDGE e = map1[i];
if(dis[e.v] > dis[u] + e.w){
dis[e.v] = dis[u] + e.w;
if(!inQue[e.v]){
que.push(e.v);
inQue[e.v] = true;
}
}
i = e.next;
}
}
} void init(){
nEdge = 0;
for(int i = 1;i <= n;i++){
head[i] = -1;
dis[i] = MAX_INT;
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
map2[i][j] = 0;
}
}
}
最大流 USTC1280的更多相关文章
- 使用C#处理基于比特流的数据
使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- FILE文件流的中fopen、fread、fseek、fclose的使用
FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...
- java I/O流
输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...
- Ford-Fulkerson 最大流算法
流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...
- .NET基础拾遗(3)字符串、集合和流
Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...
随机推荐
- 使用卷积神经网络CNN完成验证码识别
gen_sample_by_captcha.py 生成验证码图片 # -*- coding: UTF-8 -*- """ 使用captcha lib生成验证码(前提:pi ...
- 9、Docker私有registry
Docker Registry分类 Docker 默认是使用https的,但是如果在自己得私有局域网中,你指明使用http也是可以的. Registry主要的作用是托管镜像: 运行docker reg ...
- 应对 Visual Stdio 编译时出现错误:常量中有换行符
笔者最近用 Visual Stdio 时,发现一个问题,在某一次写完语言进行编绎运行时,出现了以下错误: C2001错误:变量中有换行符 C2413错误:语法错误 缺少")"(在& ...
- android 百度地图 定位获取位置失败 62错误
一切正常步骤进行但是还是没有获得定位,得到的坐标总是49E.xxxx,错误代码总是62 总是以为代码.或jar包.或还有什么权限没给.搞了好久,十分郁闷.在控制台上又没有什么具体的错误提示 经过无数次 ...
- 【Git】【环境搭建】
Mac下GitHub安装及使用教程: https://blog.csdn.net/u012460084/article/details/45830911
- Win10升级惹的祸,Oracle服务全没有了,怎么解决?
最近Win10自动升级,升级后各种服务全部没了,心已经凉了一半... 百度\Google了一大堆,无非就几种:卸载重装,还原到上一版Win10,甚至重装系统,对于正式使用的库来说,够崩溃的了.. 搜寻 ...
- kafka知识点
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...
- http协议详解及htt面试题目,常见的http状态码
http协议详解及htt面试题目,常见的http状态码 HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文. HTTP ...
- RobotFramework自动化测试框架-Selenium Web自动化(-)-Open Browser和Close Browser
Selenium出来已经有很多年了,从最初的Selenium1到后来的Selenium2,也变得越来越成熟,而且也已经被很多公司广泛使用.Selenium发展的过程中,分了很多模块,这里我们主要介绍W ...
- delphi提示“Undeclared identifier”TForm的缺少引用单元列表
在interface uses 添加TForms;