Birthday(费用流)
Birthday
https://www.nowcoder.com/acm/contest/206/A
题目描述
正如往常一样,宇扬在蛋糕上插了n支蜡烛,并把蛋糕分为m个区域。因为某种原因,他必须把第i根蜡烛插在第ai个区域或第bi个区域。区域之间是不相交的。宇扬在一个区域内同时摆放x支蜡烛就要花费x2的时间。宇扬布置蛋糕所用的总时间是他在每个区域花的时间的和。
宇扬想快些见到恬恬,你能告诉他布置蛋糕最少需要多少时间吗?
输入描述:
- 第一行包含两个整数n,m(1 ≤ n ≤ 50, 2≤ m≤ 50)。
接下来n行,每行两个整数a
i
- ,b
i
- (1 ≤ a
i
- , b
i
- ≤ m)。
输出描述:
- 一个整数表示答案。
输入例子:
- 3 3
- 1 2
- 1 2
- 1 2
输出例子:
- 5
-->
输入
- 3 3
- 1 2
- 1 2
- 1 2
输出
- 5
输入
- 3 3
- 1 2
- 2 3
- 1 3
输出
- 3
- 把每个区域分成n份,每份的费用为i*i-(i-1)*(i-1),这是参考别人的,节点数n+m+2(两个节点之间可以连多条边)
- #include<iostream>
- #include<algorithm>
- #include<queue>
- #include<cstring>
- using namespace std;
- const int INF=0x3f3f3f3f;
- const int N=;
- const int M=;
- int top;
- int dist[N],pre[N];
- bool vis[N];
- int c[N];
- int maxflow;
- struct Vertex{
- int first;
- }V[N];
- struct Edge{
- int v,next;
- int cap,flow,cost;
- }E[M];
- void init(){
- memset(V,-,sizeof(V));
- top=;
- maxflow=;
- }
- void add_edge(int u,int v,int c,int cost){
- E[top].v=v;
- E[top].cap=c;
- E[top].flow=;
- E[top].cost=cost;
- E[top].next=V[u].first;
- V[u].first=top++;
- }
- void add(int u,int v,int c,int cost){
- add_edge(u,v,c,cost);
- add_edge(v,u,,-cost);
- }
- bool SPFA(int s,int t,int n){
- int i,u,v;
- queue<int>qu;
- memset(vis,false,sizeof(vis));
- memset(c,,sizeof(c));
- memset(pre,-,sizeof(pre));
- for(i=;i<=n;i++){
- dist[i]=INF;
- }
- vis[s]=true;
- c[s]++;
- dist[s]=;
- qu.push(s);
- while(!qu.empty()){
- u=qu.front();
- qu.pop();
- vis[u]=false;
- for(i=V[u].first;~i;i=E[i].next){
- v=E[i].v;
- if(E[i].cap>E[i].flow&&dist[v]>dist[u]+E[i].cost){
- dist[v]=dist[u]+E[i].cost;
- pre[v]=i;
- if(!vis[v]){
- c[v]++;
- qu.push(v);
- vis[v]=true;
- if(c[v]>n){
- return false;
- }
- }
- }
- }
- }
- if(dist[t]==INF){
- return false;
- }
- return true;
- }
- int MCMF(int s,int t,int n){
- int d;
- int i,mincost;
- mincost=;
- while(SPFA(s,t,n)){
- d=INF;
- for(i=pre[t];~i;i=pre[E[i^].v]){
- d=min(d,E[i].cap-E[i].flow);
- }
- maxflow+=d;
- for(i=pre[t];~i;i=pre[E[i^].v]){
- E[i].flow+=d;
- E[i^].flow-=d;
- }
- mincost+=dist[t]*d;
- }
- return mincost;
- }
- int main(){
- int n,m;
- int v,u,w,c;
- int s,t;
- cin>>n>>m;
- init();
- for(int i=;i<=n;i++){
- cin>>u>>v;
- // for(int j=1;j<=n;j++){
- add(i,n+u,,);
- // }
- // for(int j=1;j<=n;j++){
- add(i,n+v,,);
- // }
- }
- s=,t=n+m+;
- for(int i=;i<=n;i++){
- add(s,i,,);
- }
- for(int i=;i<=m;i++){
- for(int j=;j<=n;j++){
- // add(n+m*(i-1)+j,t,1,j*j-(j-1)*(j-1));
- add(i+n,n+m+,,j*j-(j-)*(j-));
- }
- }
- int ans=MCMF(s,t,n+m+);
- cout<<ans<<endl;
- }
这是自己写的,节点数n+n*m+2
- #include<iostream>
- #include<algorithm>
- #include<queue>
- #include<cstring>
- using namespace std;
- const int INF=0x3f3f3f3f;
- const int N=;
- const int M=;
- int top;
- int dist[N],pre[N];
- bool vis[N];
- int c[N];
- int maxflow;
- struct Vertex{
- int first;
- }V[N];
- struct Edge{
- int v,next;
- int cap,flow,cost;
- }E[M];
- void init(){
- memset(V,-,sizeof(V));
- top=;
- maxflow=;
- }
- void add_edge(int u,int v,int c,int cost){
- E[top].v=v;
- E[top].cap=c;
- E[top].flow=;
- E[top].cost=cost;
- E[top].next=V[u].first;
- V[u].first=top++;
- }
- void add(int u,int v,int c,int cost){
- add_edge(u,v,c,cost);
- add_edge(v,u,,-cost);
- }
- bool SPFA(int s,int t,int n){
- int i,u,v;
- queue<int>qu;
- memset(vis,false,sizeof(vis));
- memset(c,,sizeof(c));
- memset(pre,-,sizeof(pre));
- for(i=;i<=n;i++){
- dist[i]=INF;
- }
- vis[s]=true;
- c[s]++;
- dist[s]=;
- qu.push(s);
- while(!qu.empty()){
- u=qu.front();
- qu.pop();
- vis[u]=false;
- for(i=V[u].first;~i;i=E[i].next){
- v=E[i].v;
- if(E[i].cap>E[i].flow&&dist[v]>dist[u]+E[i].cost){
- dist[v]=dist[u]+E[i].cost;
- pre[v]=i;
- if(!vis[v]){
- c[v]++;
- qu.push(v);
- vis[v]=true;
- if(c[v]>n){
- return false;
- }
- }
- }
- }
- }
- if(dist[t]==INF){
- return false;
- }
- return true;
- }
- int MCMF(int s,int t,int n){
- int d;
- int i,mincost;
- mincost=;
- while(SPFA(s,t,n)){
- d=INF;
- for(i=pre[t];~i;i=pre[E[i^].v]){
- d=min(d,E[i].cap-E[i].flow);
- }
- maxflow+=d;
- for(i=pre[t];~i;i=pre[E[i^].v]){
- E[i].flow+=d;
- E[i^].flow-=d;
- }
- mincost+=dist[t]*d;
- }
- return mincost;
- }
- int main(){
- int n,m;
- int v,u,w,c;
- int s,t;
- cin>>n>>m;
- init();
- for(int i=;i<=n;i++){
- cin>>u>>v;
- for(int j=;j<=n;j++){
- add(i,n+j+n*(u-),,);
- add(i,n+j+n*(v-),,);
- }
- }
- s=,t=n+n*m+;
- for(int i=;i<=n;i++){
- add(s,i,,);
- }
- for(int i=;i<=m;i++){
- for(int j=;j<=n;j++){
- add(n+n*(i-)+j,t,,j*j-(j-)*(j-));
- }
- }
- int ans=MCMF(s,t,n+n*m+);
- cout<<ans<<endl;
- }
Birthday(费用流)的更多相关文章
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- POJ2195 Going Home[费用流|二分图最大权匹配]
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22088 Accepted: 11155 Desc ...
- BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 960 Solved: 5 ...
- 洛谷 1004 dp或最大费用流
思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...
- Codeforces 730I [费用流]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给两行n个数,要求从第一行选取a个数,第二行选取b个数使得这些数加起来和最大. 限制条件是第一行选取了某个数的条件下,第二行不能选取对应位置的数. ...
- zkw费用流+当前弧优化
zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...
- 【BZOJ-4213】贪吃蛇 有上下界的费用流
4213: 贪吃蛇 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 58 Solved: 24[Submit][Status][Discuss] Desc ...
- 【BZOJ-3638&3272&3267&3502】k-Maximum Subsequence Sum 费用流构图 + 线段树手动增广
3638: Cf172 k-Maximum Subsequence Sum Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 174 Solved: 9 ...
- [bzoj4514]数字配对[费用流]
今年SDOI的题,看到他们在做,看到过了一百多个人,然后就被虐惨啦... 果然考试的时候还是打不了高端算法,调了...几天 默默地yy了一个费用流构图: 源连所有点,配对的点连啊,所有点连汇... 后 ...
- 费用流 ZOJ 3933 Team Formation
题目链接 题意:两个队伍,有一些边相连,问最大组对数以及最多女生数量 分析:费用流模板题,设置两个超级源点和汇点,边的容量为1,费用为男生数量.建边不能重复建边否则会T.zkw费用流在稠密图跑得快,普 ...
随机推荐
- python&pandas 与mysql 连接
1. python 与mysql 连接及操作,直接上代码,简单直接高效: import MySQLdb try: conn = MySQLdb.connect(host='localhost',use ...
- [转载] ./configure,make,make install的作用
1.configure,这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码:./configure –prefix=/u ...
- numpy的shuffle函数
import numpy as np from numpy.random import shuffle import pandas as pd df = pd.DataFrame([[1,2,3],[ ...
- WCF服务部署
一.将WCF服务部署到IIS上 1.首先检测电脑上是否安装了IIS,一般来说Win7以上系统自带IIS 2.下面进行IIS服务的开启设置 控制面板=>打开或关闭Windos功能 3.勾选该窗口中 ...
- java的多态性(二)
2013-10-16 19:44 9364人阅读 评论(25) 收藏 举报 分类: [JAVA开发]-----Java提高篇(36) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录 ...
- Spark SQL Hive Support Demo
前提: 1.spark1.0的包编译时指定支持hive:./make-distribution.sh --hadoop 2.3.0-cdh5.0.0 --with-yarn --with-hive - ...
- 洛谷:P1087 FBI树 P1030 求先序排列 P1305 新二叉树
至于为啥把这三个题放到一起,大概是因为洛谷的试炼场吧,三道树的水题,首先要理解 先序中序后序遍历方法. fbi树由于数量小,在递归每个区间时,暴力跑一遍区间里的数,看看是否有0和1.至于递归的方法,二 ...
- PyQt5系列教程
PyQt5系列教程(一)Mac OS X下搭建Python3.5.1+PyQt5开发环境PyQt5系列教程(二)利用QtDesigner设计UI界面PyQt5系列教程(三)用py2exe进行程序打包P ...
- uva-10392-因数分解
#include<stdio.h> #include<iostream> #include<queue> #include<memory.h> #inc ...
- Python入门-散点图绘制
Python入门-散点图绘制 废话不说 直接上代码 import matplotlib.pyplot as plt x_values = list(range(1,1001)) y_values = ...