线性规划与网络流24题●09方格取数问题&13星际转移问题
●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为“技术”不佳,搞了一上午)
●09方格取数问题(codevs1907 方格取数3)
- 想了半天,也没成功建好图;
- 无奈下参考题解,说是本题要求二分图点权最大独立集,然后可以由结论:“最大点权独立集 = 所有点权 - 最小点权覆盖集 = 所有点权 - 最小割集 = 所有点权 - 网络最大流”转化到求最大流(我真的很懵逼,但又感觉很有道理);
- 下面附上solution:(自己领悟吧)
- (不懂那个鬼结论的我就用那个结论建了个图,跑了个Dinic。)
●13星际转移问题(codevs 1908)
- (这个题的要比上一个好想一些。(因为上一题的鬼结论我真不知道))
- 思路:
- 本题的建图比较有趣,要把每个空间站按天数进行建点和连边;
- 建图:
- 1.原点(s)到地球(ear)有一条容量为k的边;(表示要送出k个人民)
- 2.月球(yue)到汇点(t)有一条容量为INF的边;
- 3.每个空间站的前一天的点到该空间站的后一天有一条容量为INF的边;(表示人民可以待在空间站里度过一天又一天)
- 4.若一个飞船在前一天在某一空间站(或地球),后一天在另一个空间站(或月球),则在对应的两个点间连一条有向边,容量为飞船的载重;(表示前一天某一空间站(或地球)的几个人民可以通过一个飞船坐到后一天的另一个空间站(或月球);
- 以题目的样例为例,上一张图帮助理解;
- 上图中:
- 方框为点,里面的数字为编号;
- 黑色箭头为边,上的数字为容量,(未标的均为INF);
- 红色路径为最大的可行流。
- (建图方法解决后,但还有一个问题,Day是未知的,该怎么确定点有多少呢?)
- 方法:枚举天数或二分天数,然后跑个最大流判断是否能将人民送完(即汇点的流入量是否等于k);
- 选择:枚举天数:
- 原因:改图比较特殊,若用枚举天数的方法,只需每次在前一次的图上加新点,连新边即可,一直到找到答案。若用二分的话,则需要每次重新建图。
- (当然,在开始枚举天数之前,先用并查集检查一下人民能否从地球到月球。)
- 总:枚举+Dinic(找最大流)+并查集(e,只是用来检查的)
●代码(为了AC掉codevs1908,把两份代码怼到一起了):
#include<iostream>
#include<cstdio>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,k,yue=1,ear=2,sz=4,ent=2,aim,tot,s,t;
int sps[30][30],cw[30][2],ld[30],ls[30],head[30000],h[30000],q[30000];
int fa[30];
struct edge{
int to,cap,next;
}e[300000];
bool special_read()
{
char s[100];
gets(s);
int a[4]={0},o=1;
int len=strlen(s);
for(int i=0;i<len;i++)
{
if('0'<=s[i]&&s[i]<='9') a[o]=a[o]*10+s[i]-'0';
else if(a[o]) o++;
}
n=a[1];m=a[2];
return k=a[3];
}
int read(int &o)
{
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while('0'<=ch&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
o=x*f;
}
void add_edge(int u,int v,int cap)
{
e[ent]=(edge){v,cap,head[u]};head[u]=ent++;
e[ent]=(edge){u,0,head[v]};head[v]=ent++;
}
void make_new_edge(int day)
{
for(int i=3;i<=n+3-1;i++) add_edge(ld[i],++sz,INF),ld[i]=sz;
for(int i=1;i<=m;i++)
{
int t=day%cw[i][1],o=sps[i][t];
if(o==ear) add_edge(ear,++sz,cw[i][0]),ls[i]=sz;
else if(o==yue) add_edge(ls[i],yue,cw[i][0]),ls[i]=0;
else
{
if(ls[i])add_edge(ls[i],ld[o],cw[i][0]);
ls[i]=ld[o];
}
}
}
bool bfs(int s,int t)
{
memset(h,0,sizeof(h));
int l=0,r=1;q[1]=s;h[s]=1;
while(l<r)
{
int u=q[++l];
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(h[v]||!e[i].cap) continue;
h[v]=h[u]+1; q[++r]=v;
}
}
return h[t];
}
int dfs(int u,int res,int t)
{
if(u==t) return res;
int flowout=0,f;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(!e[i].cap||h[v]!=h[u]+1) continue;
f=dfs(v,min(res,e[i].cap),t);
e[i].cap-=f; e[i^1].cap+=f;
flowout+=f; res-=f;
if(!res) break;
}
if(!flowout) h[u]=-1;
return flowout;
}
int Dinic(int s,int t)
{
while(bfs(s,t))
{
aim+=dfs(s,INF,t);
}
return aim;
}
void check_and_add(int a,int b,int c,int d)
{
c+=a; d+=b;
if(c==0||c==n+1||d==0||d==m+1) return;
int u=(a-1)*m+b,v=(c-1)*m+d;
add_edge(u,v,INF);
}
int find(int x)
{
if(fa[x]!=x) return fa[x]=find(fa[x]);
return x;
}
void unio(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy) fa[fy]=fx;
}
void _1908()
{
for(int i=1;i<=25;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
read(cw[i][0]);read(cw[i][1]);
for(int j=0;j<cw[i][1];j++)
{
read(sps[i][j]);
sps[i][j]+=2;
if(j)
for(int jj=0;jj<j;jj++)
unio(sps[i][jj],sps[i][j]);
}
}
if(find(yue)!=find(ear)) printf("0");
else
{
int day=0;
add_edge(3,ear,k); add_edge(yue,4,INF);
for(int i=3;i<=n+3-1;i++) ld[i]=++sz;
for(int i=1;i<=m;i++)
{
int o=sps[i][0];
if(o==ear) add_edge(ear,++sz,cw[i][0]),ls[i]=sz;
else if(o!=yue) ls[i]=ld[o];
}
while(1)
{
++day;
make_new_edge(day);
if(Dinic(3,4)==k) { printf("%d",day); break;}
} }
}
void _1907()
{
int x,co=0;
s=n*m+1;t=n*m+2;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
co=(i+j)%2;
int u=(i-1)*m+j;scanf("%d",&x); tot+=x;
if(!co)
{
add_edge(s,u,x);
check_and_add(i,j,-1,0);
check_and_add(i,j,1,0);
check_and_add(i,j,0,-1);
check_and_add(i,j,0,1);
}
else add_edge(u,t,x);
}
printf("%d",tot-Dinic(s,t));
}
int main()
{
if(special_read()) _1908();
else _1907(); return 0;
}
线性规划与网络流24题●09方格取数问题&13星际转移问题的更多相关文章
- LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流
#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)
Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...
- 【刷题】LOJ 6007 「网络流 24 题」方格取数
题目描述 在一个有 \(m \times n\) 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意 \(2\) 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数 ...
- 【PowerOJ1744&网络流24题】方格取数问题(最小割)
题意: n,m<=30 思路: [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图X集合中顶点 ...
- 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)
写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...
- 题解:线性规划与网络流24题 T2 太空飞行计划问题
太空飞行计划问题 问题描述 W教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要 ...
- AC日记——[网络流24题]方格取数问题 cogs 734
734. [网络流24题] 方格取数问题 ★★☆ 输入文件:grid.in 输出文件:grid.out 简单对比时间限制:1 s 内存限制:128 MB «问题描述: 在一个有m*n ...
- Cogs 734. [网络流24题] 方格取数问题(最大闭合子图)
[网络流24题] 方格取数问题 ★★☆ 输入文件:grid.in 输出文件:grid.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: 在一个有m*n 个方格的棋盘中,每个方格 ...
- [网络流24题] 方格取数问题/骑士共存问题 (最大流->最大权闭合图)
洛谷传送门 LOJ传送门 和太空飞行计划问题一样,这依然是一道最大权闭合图问题 “骑士共存问题”是“方格取数问题”的弱化版,本题解不再赘述“骑士共存问题”的做法 分析题目,如果我们能把所有方格的数都给 ...
随机推荐
- 201621123062《java程序设计》第六周作业总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...
- 冲刺NO.6
Alpha冲刺第六天 站立式会议 项目进展 项目中学生基本信息管理,与系统管理员模块基本完成,团队开始编写学生信用信息模块内容与奖惩事务管理内容,准备开始对已完成模块进行测试. 问题困难 团队成员对前 ...
- 201621123031 《Java程序设计》第2周学习总结
Week02-Java基本语法与类库 1. 本周学习总结 本周讲了Java的基本数据类型,主要分为八类(byte,short,int,long,double,float,char,boolean),其 ...
- Jmeter读取文件中的值《一》
此篇主要是对应上一章节的呼应,上一篇中讲到将返回值写入文件,这个值如果在下一个接口中用到, 那么我们需要去从文件中读取数据,这是我们该如何操作? 一.测试计划中添加CSV Data Set Confi ...
- xxe漏洞检测及代码执行过程
这两天看了xxe漏洞,写一下自己的理解,xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目録遍历等.首先存在漏洞的web服务一定是存 ...
- Python内置函数(14)——bytes
英文文档: class bytes([source[, encoding[, errors]]]) Return a new "bytes" object, which is an ...
- 作业三:模拟 mysql 进行增删改查
# !/usr/bin/env python3 # _*_coding:utf-8_*_ def help_sql(cmd): if cmd in func_dic.keys(): print('{} ...
- WPF自定义控件与样式-自定义按钮(Button)
一.前言 程序界面上的按钮多种多样,常用的就这几种:普通按钮.图标按钮.文字按钮.图片文字混合按钮.本文章记录了不同样式类型的按钮实现方法. 二.固定样式的按钮 固定样式的按钮一般在临时使用时或程序的 ...
- kafka HA
1. replication 如图.1所示,同一个 partition 可能会有多个 replica(对应 server.properties 配置中的 default.replication.fac ...
- Spring Boot面试题
Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...