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

 /**************************************************************
作者:陈新
邮箱: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. c++的虚继承

    今天去面试了一家公司,真是套路深啊,套路深,原谅我是后知后觉,所以人吧总的长大,出差正常情况下都是有补贴的,为啥这部分也要算我工资一部分,名其名曰工资高,哈哈哈,自古套路方得人心 今天学习了一下c++ ...

  2. 不校验csrf

    from django.views.decorators.csrf import csrf_exempt@csrf_exemptdef a(request): pass

  3. ImportFileHandler 附件上传

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using LitJson; ...

  4. threadpool源码学习

    threadpool源码学习 __all__ = [ 'makeRequests', 'NoResultsPending', 'NoWorkersAvailable', 'ThreadPool', ' ...

  5. Lintcode470-Tweaked Identical Binary Tree-Easy

    470. Tweaked Identical Binary Tree Check two given binary trees are identical or not. Assuming any n ...

  6. Microsoft.AspNet.Web.Optimization.Bundle的完美替换方案

    Web应用程序中包含大量的样式(css)和脚本(js)文件,这些文件的引用.管理和发布有很多解决方案.在Asp.Net MVC应用程序中,大家最熟悉的解决方案应属Microsoft.AspNet.We ...

  7. druid 连接池加密算法

    package juint; import com.alibaba.druid.filter.config.ConfigTools; public class DruidTest { public s ...

  8. highcharts数据标签显示在柱状图里面解决办法

    1.现象:当各项占比相同时,数据显示在柱状图里面 2.解决方法: 3.效果

  9. mysql log and lock

    mysql bin log==> /etc/my.cnf==> log_bin=/var/log/mysql/mysql-bin.log==> binlog_do_db=your_d ...

  10. kotlin 委托

    委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理. Kotlin 直接支持委托模式,更加优雅,简洁.Kotlin 通过关键 ...