挺有意思的一题,最小路径之后最大流

 /**************************************************************
作者:陈新
邮箱: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的更多相关文章

  1. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  2. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  3. FILE文件流的中fopen、fread、fseek、fclose的使用

    FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...

  4. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  5. java 字节流与字符流的区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...

  6. BZOJ 3504: [Cqoi2014]危桥 [最大流]

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1407  Solved: 703[Submit][Status] ...

  7. java I/O流

    输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...

  8. Ford-Fulkerson 最大流算法

    流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...

  9. .NET基础拾遗(3)字符串、集合和流

    Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...

随机推荐

  1. Python模块1

    序列化模块: 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 序列化的目的 1.以某种存储形式使自定义对象持久化: 2.将对象从一个地方传递到另一个地方. 3.使程序更具维护性. jso ...

  2. linux基础之加密解密、PKI及SSL、创建私有CA

    加密解密基础 1. 对称加密: 加密和解密使用同一个密钥 常见的加密算法有:DES.3DES.AES.Blowfish.Twofish.IDEA.RC6.CAST5 特性: 1. 加密.解密使用同一个 ...

  3. LintCode 1.A+B的问题

    LintCode 1.A+B的问题 描述 给出两个整数 a 和 b , 求他们的和. 答案 public class Solution { /** * @param a: An integer * @ ...

  4. 比原链(Bytom)先知节点 Ubuntu接入文档

    系统要求 我们建议选择知名的VPS服务商,运行比原链节点对算力没有要求,但是请配置尽可能大的磁盘空间. 节点服务器最小配置: 操作系统: Windows/Linux/Docker CPU: 2核 内存 ...

  5. Complex类的设计与改进

    Complex类 源码 #include <cmath> #include <iomanip> #include <iostream> #include <s ...

  6. .NET in Browser - Blazor

    什么是Blazor Blazor 是一个实验性的. NET web 框架, 使用 C# 和 HTML 在任何浏览器中不需要插件即可运行 WebAssembly 程序集. 什么是WebAssembly ...

  7. sublime Text 常用插件

    1.LocalizedMenu 语言插件 2.SublimeRPEL   这个我主要是用python,设置快捷键后很方便 3.以后用到什么再补充

  8. 小程序配置tabbar

    app.json中添加tabbar "tabBar": { "color": "#a9b7b7", //未选中字体颜色 "sele ...

  9. Web浏览器与Web服务器之间的通信过程

     HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:1:建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连 ...

  10. K3WISE常用表

    在后台数据库ICClassType表中,字段FID<0的是老单,FID>0的是新单.   ----------------系统设置------------------------   FS ...