最大流 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与数据库开发基础 ...
随机推荐
- ubuntu下C/C++获取剩余内存
#include <stdio.h> #include <unistd.h> long get_memory_usage() { long page_size = syscon ...
- ConcurrentHashMap源码理解
1.ConcurrentHashMap继承关系 ConcurrentHashMap继承了AbstractMap类,同时实现了ConcurrentMap接口. 2.ConcurrentHashMap构造 ...
- threadpool源码学习
threadpool源码学习 __all__ = [ 'makeRequests', 'NoResultsPending', 'NoWorkersAvailable', 'ThreadPool', ' ...
- 每天一套题打卡|河南省第十一届ACM/ICPC
A 计划日 题意:已知李明在YYYY年MM月DD日星期W订了学习计划,现在想看看李明N天后的完成情况和个人总结,你能告诉我那天的日期和星期几吗? 模拟日期计算: 计算星期可以用基姆拉尔森公式 //中国 ...
- ZJOI 2017 树状数组(线段树套线段树)
题意 http://uoj.ac/problem/291 思路 不难发现,九条カレン醬所写的树状数组,在查询区间 \([1,r]\) 的时候,其实在查询后缀 \([r,n]\) :在查询 \([l,r ...
- sql server把一个库表的某个字段更新到另一张表的相同字段
缘由:进行update时忘了加where条件,导致所有数据全部update.. sql: 1 update Activity set endTime=b.endTime from idj_tl_bf. ...
- Mac连接非22端口linux服务器
Mac连接非22端口linux服务器 原文链接:https://www.cnblogs.com/blog5277/p/9507080.html 原文作者:博客园--曲高终和寡 1:ssh连接 打开终端 ...
- # 常用linux 命令和相关问题解决
最近试着自己部署了服务器,在unbantu的环境下 学习了很多新知识 也遇到了很多问题,现在腾出手了,总结一下 常用Linux命令 目录操作 pwd: 查看当前路径 cd: 移动 cd .. : 返回 ...
- PHP算法练习1:两数之和
leetcode地址:https://leetcode-cn.com/problems/two-sum/description/ 题目: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. ...
- spring 事务关键类
TransactionInterceptor-> TransactionAspectSupport spring 事务的提交 AbstractPlatformTransactionManager