●(做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星际转移问题的更多相关文章

  1. LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

    #6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  2. Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)

    Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...

  3. 【刷题】LOJ 6007 「网络流 24 题」方格取数

    题目描述 在一个有 \(m \times n\) 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意 \(2\) 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数 ...

  4. 【PowerOJ1744&网络流24题】方格取数问题(最小割)

    题意: n,m<=30 思路: [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图X集合中顶点 ...

  5. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  6. 题解:线性规划与网络流24题 T2 太空飞行计划问题

    太空飞行计划问题 问题描述 W教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要 ...

  7. AC日记——[网络流24题]方格取数问题 cogs 734

    734. [网络流24题] 方格取数问题 ★★☆   输入文件:grid.in   输出文件:grid.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: 在一个有m*n ...

  8. Cogs 734. [网络流24题] 方格取数问题(最大闭合子图)

    [网络流24题] 方格取数问题 ★★☆ 输入文件:grid.in 输出文件:grid.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: 在一个有m*n 个方格的棋盘中,每个方格 ...

  9. [网络流24题] 方格取数问题/骑士共存问题 (最大流->最大权闭合图)

    洛谷传送门 LOJ传送门 和太空飞行计划问题一样,这依然是一道最大权闭合图问题 “骑士共存问题”是“方格取数问题”的弱化版,本题解不再赘述“骑士共存问题”的做法 分析题目,如果我们能把所有方格的数都给 ...

随机推荐

  1. 201621123062《java程序设计》第六周作业总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...

  2. 冲刺NO.6

    Alpha冲刺第六天 站立式会议 项目进展 项目中学生基本信息管理,与系统管理员模块基本完成,团队开始编写学生信用信息模块内容与奖惩事务管理内容,准备开始对已完成模块进行测试. 问题困难 团队成员对前 ...

  3. 201621123031 《Java程序设计》第2周学习总结

    Week02-Java基本语法与类库 1. 本周学习总结 本周讲了Java的基本数据类型,主要分为八类(byte,short,int,long,double,float,char,boolean),其 ...

  4. Jmeter读取文件中的值《一》

    此篇主要是对应上一章节的呼应,上一篇中讲到将返回值写入文件,这个值如果在下一个接口中用到, 那么我们需要去从文件中读取数据,这是我们该如何操作? 一.测试计划中添加CSV Data Set Confi ...

  5. xxe漏洞检测及代码执行过程

    这两天看了xxe漏洞,写一下自己的理解,xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目録遍历等.首先存在漏洞的web服务一定是存 ...

  6. Python内置函数(14)——bytes

    英文文档: class bytes([source[, encoding[, errors]]]) Return a new "bytes" object, which is an ...

  7. 作业三:模拟 mysql 进行增删改查

    # !/usr/bin/env python3 # _*_coding:utf-8_*_ def help_sql(cmd): if cmd in func_dic.keys(): print('{} ...

  8. WPF自定义控件与样式-自定义按钮(Button)

    一.前言 程序界面上的按钮多种多样,常用的就这几种:普通按钮.图标按钮.文字按钮.图片文字混合按钮.本文章记录了不同样式类型的按钮实现方法. 二.固定样式的按钮 固定样式的按钮一般在临时使用时或程序的 ...

  9. kafka HA

    1. replication 如图.1所示,同一个 partition 可能会有多个 replica(对应 server.properties 配置中的 default.replication.fac ...

  10. Spring Boot面试题

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...