HDU 6437 最小费用最大流
题目链接
题意:
一天有n个小时,有m部视频,有k个人,每个视频有一个放映起始时间,放映终止时间,可获得愉悦值,电影类型,当同一个人连续看两场同类型视频时对于当前看的视频获得的愉悦值减少w,求k个人获得的总愉悦值最大为多少(视频类型仅有两种)
思路:
按时间顺序为两类视频类型建立两条时间线(假设第一条为1->n,第二条为n+1->n+n)建立一个超级源点和一个源点,超级源点向源点建立一条流量为k费用为0的边表示最多可以有k个人,源点向两个时间线的起点1和1+n建立一条流量无限费用为0的边表示某一人开始走时间线,时间线的终点n和n+n向汇点建立一条流量无限费用为0的边表示某一人走完了时间线,当有视频时比如开始放映时间为S结束放映时间为T,先从视频向该视频源点建立一条边(第i个视频用n+n+i表示其视频源点)表示该视频只能被看一次,然后由视频向同时间线上的T连接费用为v-w的边向另一条时间线上的T连接费用为v的边,分别表示前一次看的视频为同类型和不同类型情况下看该视频的愉悦值收益
C++代码:
#include<bits/stdc++.h>
using namespace std;
int Abs( int a ){ return a>0?a:-a; }
int Max( int a , int b ){ return a>b?a:b; }
int Min( int a , int b ){ return a<b?a:b; }
int Gcd( int a , int b ){ return b==0?a:Gcd( b , a%b ); }
const int maxn = 610;
const int maxm = 2*610*610;
const int inf = 0x3f3f3f3f;int n,m,k,w;
struct edge
{int to,cap,cost,next;
}es[maxm];
int tol,max_flow,min_cost;
int head[maxn],dis[maxn],vis[maxn];void init()
{tol = max_flow = min_cost = 0;memset ( head , -1 , sizeof(head) );
}void addedge( int u , int v , int c , int w )
{es[tol].to = v;es[tol].cap = c;es[tol].cost = w;es[tol].next = head[u];head[u] = tol++;es[tol].to = u;es[tol].cap = 0;es[tol].cost = -w;es[tol].next = head[v];head[v] = tol++;
}int spfa( int s , int t )
{memset ( vis , 0 , sizeof(vis) );for ( int i=s ; i<=t ; i++ ) dis[i] = inf;queue<int>Q; Q.push(t); dis[t] = 0; vis[t] = 1;while ( !Q.empty() ){int u = Q.front(); Q.pop(); vis[u] = 0;for ( int i=head[u] ; i!=-1 ; i=es[i].next ){int v = es[i].to,w = es[i].cost;if ( es[i^1].cap&&dis[v]>dis[u]-w ){dis[v] = dis[u]-w;if ( !vis[v] ){vis[v] = 1;Q.push(v);}}}}return dis[s]<inf;
}int dfs( int t , int u , int flow )
{vis[u] = 1;if ( u==t ) return flow;int used = 0;for ( int i=head[u] ; i!=-1 ; i=es[i].next ){int v = es[i].to,w = es[i].cost;if ( !vis[v]&&es[i].cap&&dis[v]==dis[u]-w ){int new_flow = dfs( t , v , Min( flow-used , es[i].cap ) );if ( new_flow ){used += new_flow;es[i].cap -= new_flow;es[i^1].cap+= new_flow;min_cost += new_flow*w;}}if ( used==flow ) break;}return used;
}void MCMF( int s , int t )
{while ( spfa( s , t ) ){do{memset ( vis , 0 , sizeof(vis) );max_flow += dfs( t , s , inf );}while ( vis[t] );}printf ( "%d\n" , -min_cost );
}int main()
{for ( int T ; scanf ( "%d" , &T )==1 ; ){for ( int cas=1 ; cas<=T ; cas++ ){init();scanf ( "%d%d%d%d" , &n , &m , &k , &w );addedge( 0 , n+n+m+1 , k , 0 );addedge( n+n+m+1 , 1 , inf , 0 );addedge( n+n+m+1 , n+1 , inf , 0 );addedge( n , n+n+m+2 , inf , 0 );addedge( n+n , n+n+m+2 , inf , 0 );for( int i=1 ; i<n ; i++ ){addedge( i , i+1 , inf , 0 );addedge( n+i , n+i+1 , inf , 0 );}for ( int i=1 ; i<=m ; i++ ){int s,t,v,p; scanf ( "%d%d%d%d" , &s , &t , &v , &p );s = s+n*p;t = t+n*p;addedge( s , n+n+i , 1 , 0 );addedge( n+n+i , t , 1 , -v+w );if ( t>n ) t -= n; else t += n;addedge( n+n+i , t , 1 , -v );}MCMF( 0 , n+n+m+2 );}}return 0;
}
HDU 6437 最小费用最大流相关推荐
- HDU 4411Arrest(最小费用最大流)
题意: 思路: [费用流]建图:代后 枚举k,求最小费用. 1 #include<stdio.h> 2 #include<string.h> 3 4 #include < ...
- hdu 6118 最小费用可行流(注意与最大流的区别)
题意: 思路:....注意是可行流,在找增广路的时候条件要进行修改....修改的地方看代码注释 代码: #include<bits/stdc++.h> using namespace st ...
- HDU 2282 Chocolate (最小费用最大流)
HDU 2282 Chocolate (最小费用最大流) #include <iostream> #include <cstdio> #include <queue&g ...
- HDU 1853 HDU 3488【有向环最小权值覆盖问题 】最小费用最大流
HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]带权二分图匹配 KM算法 In the kingdom of Henryy, there are N (2 <= N & ...
- 【HDU - 6118】度度熊的交易计划(最小费用可行流,网络流费用流变形 )
题干: 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个 ...
- hdu Kaka's Matrix Travels(最小费用最大流)
把题意写一下: 给你一个n*n的矩阵,每个格子都有一个非负整数,从左上角走到右下角,收集走过的数字,累加,但是只能向右或者向下走,走过之后数字就变为0,让你求从左上角到右下角,走k次之后,所得的最大 ...
- HDU 6445 Search for Answer(最小费用最大流-mcmf)
Description 给出一个nnn个点的完全图的邻接矩阵aaa,其中ai,j=1a_{i,j}=1ai,j=1表示i,ji,ji,j之间边的方向是iii到jjj,ai,j=0a_{i,j}=0a ...
- Going Home HDU - 1533 (最小费用最大流)
题目链接:https://cn.vjudge.net/problem/HDU-1533 题意:给你n个房子n个人 使得所有人都有一座房子的最小花费 思路:把所有的人与房子建边,最后,源点与所有的人建 ...
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
- 网络流--最小费用最大流 (理解)
1.什么是最小费用最大流问题 上篇文章我们讲解了最大流问题,那什么是最小费用最大流呢?听名字就可以看出,我们要在满足最大流的同时找到达成最大流的最小费用. 对于一个网络流,最大流是一定的,但是组成最大 ...
最新文章
- 中南大学计算机跻身国内前10,南方科大工程排名超北航丨泰晤士2021世界大学学科排名...
- nodejs html转excel,Node.js excel sheetjs/js-xlsx
- 实验二 二叉树的操作与实现
- 关于windows cmd的一些便捷应用
- 软件项目管理-构建之法-四周总结
- java jdbc(mysql)驱动源码分析_JAVA JDBC(MySQL)驱动源码分析(二)
- BZOJ2654: tree 二分答案+最小生成树
- javascript之this指向
- Android百度地图修改定位时间间隔
- 2019全国大学生电子设计竞赛(电赛)回忆录
- excel求回归直线方程的公式_如何用excel做线性回归分析-用excel做线性回归分析求回归方程...
- android实现支付功能,Android支付宝支付开发实例
- 编译g2o提示错误 error: ‘ScalarBinaryOpTraits’ is not a class template
- 如何解决浏览器提示“您与此网站之间建立的连接不安全”
- V4L2文档翻译(九)
- 怎么训练神经网络模型,神经网络模型训练过程
- JAVA知识体系之分布式篇(七)——Redis
- 期刊论文和会议论文的区分与识别
- kubernetes部署 rook ceph
- 仿JD商城UI布局达到90%
热门文章
- java cad polyline,为AUTOCAD编写系列批量处理程序
- Visual Studio Code (vscode)配置LaTeX最详细版(vscode下载安装+基本设置+内外pdf查看器设置+个人配置代码)
- 关于坑爹的QQ互联成为开发者的坑
- ABP框架----写一个WebAPI
- 7z解压软件(小巧好用)。百度云下载链接
- PDF解密工具—Cisdem PDF Password Remover
- java生成点阵图_点阵字库在JAVA中的实现
- docker装LibreELEC_Linux和macOS系统安装LibreELEC的方法
- 小程序 tab 切换点击无效
- html网页中加入音乐播放器,[HTML5]简单网页本地音乐播放器