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

建二分图,黑色矩阵为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. SCU 4442 party 二分图最大点权独立集

    每个青蛙喝黑茶或者红茶或者都可以喝 M个矛盾关系 有矛盾的不能喝同种茶 但你可以花费Wi使得这个青蛙消除所有矛盾 把矛盾当作边 青蛙当作点 如果这两个青蛙只喝不同的一种茶就不建边 题目中保证了不存在奇 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. DUT Star Weekly Contest #3 Problem F Solution

    题目链接 问题转化 \[a_i+a_j+(i-j)^2=a_i+i^2+a_j+j^2-2ij\] 令 \(b_i=a_i+i^2\) , 问题化为: 求 \[\max \{b_i+b_j-2ij\} ...

  2. Page-encoding specified in XML prolog (UTF-8) is different from that specified in page directive (utf-8)

    org.apache.jasper.JasperException:xxx.jsp(1,1) Page-encoding specified in XML prolog (UTF-8) is diff ...

  3. List 集合线程安全测试

    最近在做一些代码整理工作,涉及到List 线程安全问题,查了一些资料.网上有些资料说List 增减成员(Add , Remove) 是安全的,但不保证成员属性值访问安全性,及禁止对 List 跨线程遍 ...

  4. ACM Minimum Inversion Number 解题报告 -线段树

    C - Minimum Inversion Number Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &a ...

  5. sencha touch pull-refresh-panel 面板下拉刷新

    转自:http://www.cnblogs.com/mlzs/archive/2013/06/04/3117518.html 此效果手机未测试,目测没问题,我是搬运工... 演示地址:http://s ...

  6. tomcat context 配置 项目部署

    将tomcat/conf/server.xml文件打开, 在</Host>标签之前添加: <Context path = "" docBase = "F ...

  7. OpenCV学习(1)-安装(Windows)

    下载安装 在这里下载.我下载了2.4.9的Windows版本.双击安装即可. 配置环境变量 配置环境变量的目的是为了让系统找到OpenCV的动态链接库.因此需要把动态链接库添加到系统环境变量PATH中 ...

  8. [vue开发记录]vue仿ios原生datepicker实现

    先上个效果图 现在只开发了年月,还在优化. 在网上看了一个纯原生js实现实现惯性滚动和回弹的文章  地址:https://www.cnblogs.com/ranyonsue/p/8119155.htm ...

  9. Springboot 允许跨域访问

    服务提供段Application.java中添加如下代码: @Beanpublic CorsFilter corsFilter() { UrlBasedCorsConfigurationSource ...

  10. .NET手记-Autofac进阶(传递注册参数 Passing Parameters to Register)

    当你注册组件时,可以为组件服务传入一系列参数,用于服务解析时使用. 可使用的参数类型 Available Parameter Types Autofac提供了集中参数匹配类别: NamedParame ...