●(做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. C++布隆过滤器

    布隆过滤器 这名词有没有听着好像很 挺高大上的,的确,它也是一种很重要的结构,下面一起看看: 一:说说历史: (Bloom Filter)是由布隆(Burton Howard Bloom)在1970年 ...

  2. tomcat下的web.xml和项目中的web.xml

    Tomcat 服务器中存在一个web.xml文件 在项目文件夹中同样存在一个web.xml文件 那这两个文件有什么区别呢? tomcat中的web.xml是通用的,如果不设置,那么就会默认是同tomc ...

  3. 码农、黑客和2B程序员之间的区别

    码农: 黑客: 2B程序员: 求2的32次方: 码农: System.out.println(Math.pow(2, 32)); 黑客: System.out.println(1L<<32 ...

  4. thinkphp中ajax技术

    thinkphp可以直接返回json数据,json数据事可以跟前端的js通用的

  5. 移动端300ms与点透总结

    300ms,主要发生在mobile 为啥会出现300ms延迟现象 浏览器想知道用户是否dobule tap(双击缩放) 下列情况不会出现300ms延迟 桌面浏览器 meta的viewport设置了us ...

  6. JAVA 中一个非常轻量级只有 200k 左右的 RESTful 路由框架

    ICEREST 是一个非常轻量级只有 200k 左右的 RESTful 路由框架,通过 ICEREST 你可以处理 url 的解析,数据的封装, Json 的输出,和传统的方法融合,请求的参数便是方法 ...

  7. Extensions in UWP Community Toolkit - FrameworkElement Extensions

    概述 UWP Community Toolkit Extensions 中有一个为FrameworkElement 提供的扩展 - FrameworkElement Extensions,本篇我们结合 ...

  8. redis入门(04)redis的数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). 1.String(字符串) ...

  9. 阿里云API网关(7)开发指南-API参考

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  10. Linux实战案例(4)CentOS清除用户登录记录和命令历史方法

    CentOS清除用户登录记录和命令历史方法 清除登陆系统成功的记录[root@localhost root]# echo > /var/log/wtmp //此文件默认打开时乱码,可查到ip等信 ...