题目大概说有几个黑色、白色矩阵,问能选出黑白不相交的矩形面积和的最大值。

建二分图,黑色矩阵为X部的点,白色为Y部,XY的点权都为其矩阵面积,如果有个黑白矩阵相交则它们之间有一条边,那样问题就是要从这个二分图中选出最大的点使其没有公共边且点权和最大。

即二分图的最大点权独立集。可以建容量网络用最小割求解,在二分图基础上加源点汇点,源点向X部连容量为权值的边,Y部向汇点连容量为权值的边,X部与Y部的无向边改为容量INF的有向边,最后的结果就是所有点权和-最小割。

 #include<cstdio>
 #include<cstring>
 #include<queue>
 #include<algorithm>
 using namespace std;
 #define INF (1<<30)
 #define MAXN 444
 #define MAXM 444*444*2
 struct Edge{
     int v,cap,flow,next;
 }edge[MAXM];
 int vs,vt,NV,NE,head[MAXN];
 void addEdge(int u,int v,int cap){
     edge[NE].v=v; edge[NE].cap=cap; edge[NE].flow=;
     edge[NE].next=head[u]; head[u]=NE++;
     edge[NE].v=u; edge[NE].cap=; edge[NE].flow=;
     edge[NE].next=head[v]; head[v]=NE++;
 }
 int level[MAXN];
 int gap[MAXN];
 void bfs(){
     memset(level,-,sizeof(level));
     memset(gap,,sizeof(gap));
     level[vt]=;
     gap[level[vt]]++;
     queue<int> que;
     que.push(vt);
     while(!que.empty()){
         int u=que.front(); que.pop();
         ; i=edge[i].next){
             int v=edge[i].v;
             ) continue;
             level[v]=level[u]+;
             gap[level[v]]++;
             que.push(v);
         }
     }
 }
 int pre[MAXN];
 int cur[MAXN];
 int ISAP(){
     bfs();
     memset(pre,-,sizeof(pre));
     memcpy(cur,head,sizeof(head));
     ,aug=INF;
     gap[]=NV;
     while(level[vs]<NV){
         bool flag=false;
         ; i=edge[i].next){
             int v=edge[i].v;
             ){
                 flag=true;
                 pre[v]=u;
                 u=v;
                 aug=min(aug,edge[i].cap-edge[i].flow);
                 if(v==vt){
                     flow+=aug;
                     for(u=pre[v]; v!=vs; v=u,u=pre[u]){
                         edge[cur[u]].flow+=aug;
                         edge[cur[u]^].flow-=aug;
                     }
                     aug=INF;
                 }
                 break;
             }
         }
         if(flag) continue;
         int minlevel=NV;
         ; i=edge[i].next){
             int v=edge[i].v;
             if(edge[i].cap!=edge[i].flow && level[v]<minlevel){
                 minlevel=level[v];
                 cur[u]=i;
             }
         }
         ) break;
         level[u]=minlevel+;
         gap[level[u]]++;
         u=pre[u];
     }
     return flow;
 }
 struct Rect{
     int x1,y1,x2,y2;
 }black[],white[];
 bool isOver(Rect &r1,Rect &r2){
     ;
     ;
 }
 int getArea(Rect &r){
     return (r.x2-r.x1)*(r.y2-r.y1);
 }
 int main(){
     int t,n,m,x1,y1,x2,y2;
     scanf("%d",&t);
     while(t--){
         scanf("%d%d",&n,&m);
         vs=; vt=n+m+; NV=vt+; NE=;
         memset(head,-,sizeof(head));
         ;
         ; i<=n; ++i){
             scanf("%d%d%d%d",&black[i].x1,&black[i].y1,&black[i].x2,&black[i].y2);
             addEdge(vs,i,getArea(black[i]));
             tot+=getArea(black[i]);
         }
         ; i<=m; ++i){
             scanf("%d%d%d%d",&white[i].x1,&white[i].y1,&white[i].x2,&white[i].y2);
             addEdge(i+n,vt,getArea(white[i]));
             tot+=getArea(white[i]);
         }
         ; i<=n; ++i){
             ; j<=m; ++j){
                 if(isOver(black[i],white[j])) addEdge(i,j+n,INF);
             }
         }
         printf("%d\n",tot-ISAP());
     }
     ;
 }

SCU3185 Black and white(二分图最大点权独立集)的更多相关文章

  1. BZOJ 1475 方格取数(二分图最大点权独立集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1475 [题目大意] 给出一个n*n的方格,从中取一些不相邻的数字,使得和最大 [题解] ...

  2. zoj 3165 (最小割,最大点权独立集)

    胡伯涛的<最小割模型在信息学竞赛中的应用>写的真牛. 这道题是选择一些男孩和女孩参加party,邀请的男孩女孩之间不能有 8g,图就是个明显的二分图,就是选择一些点之间没有8g关系,就是二 ...

  3. 【最大点权独立集】【HDU1565】【方格取数】

    题目大意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. 初看: 没想法 ...

  4. hdu 1565&amp;&amp;hdu 1569 (最大点权独立集)

    题目意思很明确就是选一些没有相连的数字,使和最大,建成二分图后求最大点权独立集,, #include<stdio.h> #include<string.h> const int ...

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

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

  6. 最小点权覆盖集&amp;最大点权独立集

    最小点权覆盖集 二分图最小点权覆盖集解决的是这样一个问题: 在二分图中,对于每条边,两个端点至少选一个,求所选取的点最小权值和. 方法: 1.先对图二分染色,对于每条边两端点的颜色不同 2.然后建立源 ...

  7. HDU1569 最大流(最大点权独立集)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  8. hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)

    /** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...

  9. [学习笔记]最小割之最小点权覆盖&amp;&amp;最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

随机推荐

  1. 【温故而知新-Javascript】使用地理定位

    地理定位(Geolocation)API让我们可以获取用户当前地理位置的信息(或者至少是正在运行浏览器的系统的位置).它不是HTML5规范的一部分,但经常被归组到与HTML5相关的新功能中. 1. 使 ...

  2. Swift 1.0: missing argument label &#39;xxx&#39; in call

    注意,这个问题是在swift1.0时发生的,swift2.0中,好像统一了function 和 method 的定义,具体待正式版发布后研究一下! 今天在使用swift时发现,写的func总是要求写出 ...

  3. Ubuntu中root用户和user用户的相互切换(转)

    Ubuntu是最近很流行的一款Linux系统,因为Ubuntu默认是不启动root用户,现在介绍如何进入root的方法. (1)从user用户切换到root用户 不管是用图形模式登录Ubuntu,还是 ...

  4. [ZZ] C++ pair

    Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型,第一个元素是int型的 ...

  5. photpshop渐变玩法_学习教程

  6. 基于微信公众平台的开发(清华大学第二讲)_Alien的笔记

    基于微信公众平台的开发(清华大学第二讲)_Alien的笔记 基于微信公众平台的开发(清华大学第二讲)

  7. (转)解决jdk1.8中发送邮件失败(handshake_failure)问题

    解决jdk1.8中发送邮件失败(handshake_failure)问题 作者 zhisheng_tian 2016.08.12 22:44* 字数 1573 阅读 2818评论 6喜欢 9 暑假在家 ...

  8. ADODB.Connection、ADODB.RecordSet

    1.数据库连接对象(ADODB. Connection)该对象用于与ODBC数据库建立连接,所有对数据库的操作均通过该连接进行.数据库连接对象ADODB. Connection的作用象Delphi中的 ...

  9. 十五、过滤器(Filter)

    过滤器(Filter) 过滤器概述 1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servlet时,会先执 ...

  10. Windows平台下SVN安装配置及使用

    原文链接:https://www.cnblogs.com/snake-hand/archive/2013/06/09/3130022.html,等有空了玩一玩吧,现在没空.