6445: 棋盘V

时间限制: 1 Sec  内存限制: 128 MB
提交: 325  解决: 31
[提交] [状态] [讨论版] [命题人:admin]

题目描述

有一块棋盘,棋盘的边长为100000,行和列的编号为1到100000。棋盘上有n个特殊格子,任意两个格子的位置都不相同。
现在小K要猜哪些格子是特殊格子。她知道所有格子的横坐标和纵坐标,但并不知道对应关系。换言之,她只有两个数组,一个存下了所有格子的横坐标,另一个存下了所有格子的纵坐标,而且两个数组都打乱了顺序。当然,小K猜的n个格子的位置也必须都不相同。
请求出一个最大的k,使得无论小K怎么猜,都能猜对至少k个格子的位置。

输入

输入数据第一行包含一个整数n。
接下来n行,每行描述一个特殊格子的位置。第i行含有两个整数xi和yi ,代表第i个格子的坐标。保证任意两个格子的坐标都不相同。

输出

输出一行,包含一个整数,代表最大的k。

样例输入

2
1 1
2 2

样例输出

0

提示

小K有可能会猜(1,2),(2,1),此时一个都没对
对于30%的数据,n≤8。
另外有5%的数据,所有横坐标和纵坐标均不相同。
另外有15%的数据,所有横坐标或者纵坐标均不相同。
对于100%的数据,n≤50,1≤xi,yi≤100000。

来源/分类

中山纪念中学20170301

【题意】

对于题意,应该理解为,小K尽量猜错。

对于给出的坐标x和y,完成一个一一匹配,使得匹配完成后,与原坐标重复的最少。

【分析】

貌似是一个带权二分图匹配问题,没试过KM算法是否可行。我用的费用流。

对输入的坐标离散化一下,方便建图。

枚举x坐标和y坐标,若(x,y)之间是正确边,则建边容量=1,费用=1;否则,建边容量=1,费用=0;

虚拟源点0,汇点maxver(一个很大的不存在的编号即可)

对0到所有的x坐标建边,容量为x行所含做标数,费用=0

对所有y到maxver建边,容量为y列所含做标数,费用=0;

对此图跑一遍费用流,按照费用流策略,优先走费用为0的边,即错误边,错误边满流时,不得不走正确边,花费1.

故最后的费用流即为不得不猜对的坐标。

【代码】

/****
***author: winter2121
****/
#include<bits/stdc++.h>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define SI(i) scanf("%d",&i)
#define PI(i) printf("%d\n",i)
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int MAX=4e2+5;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
int dir[9][2]={0,1,0,-1,1,0,-1,0, -1,-1,-1,1,1,-1,1,1};
template<class T>bool gmax(T &a,T b){return a<b?a=b,1:0;}
template<class T>bool gmin(T &a,T b){return a>b?a=b,1:0;}
template<class T>void gmod(T &a,T b){a=(a%mod+b)%mod;}struct node{int s,t,len,cap,flow,next;
}e[MAX*MAX];//len路长,cap最大流量,flow已流的量
int head[MAX],cnt;
void add(int u,int v,int len,int cap,int flow=0)
{e[cnt]=node{u,v,len,cap,flow,head[u]};head[u]=cnt++;
}
int dis[MAX];//最短路
bool inq[MAX];
int f[MAX];//流量
int pre[MAX];//前驱边
bool spfa(int s,int t,int &flow,int &cost,int ver) //ver是最大点编号
{for(int i=0;i<=ver;i++)dis[i]=INF;memset(inq,0,sizeof(inq));dis[s]=0;f[s]=INF;queue<int>q;q.push(s);while(!q.empty()){int u=q.front();q.pop();inq[u]=0;for(int i=head[u];~i;i=e[i].next){if(e[i].cap-e[i].flow>0&&dis[e[i].t]>dis[u]+e[i].len)   //只要有流量,并且路径变短{f[e[i].t]=min(f[u],e[i].cap-e[i].flow);dis[e[i].t]=dis[u]+e[i].len;pre[e[i].t]=i;if(!inq[e[i].t])q.push(e[i].t),inq[e[i].t]=1;}}}if(dis[t]==INF) return 0;  //没走到终点flow+=f[t];  //本条增广路的流量cost+=dis[t]*f[t];  //花费for(int u=t;u!=s;u=e[pre[u]].s){e[pre[u]].flow+=f[t];e[pre[u]^1].flow-=f[t];}return 1;
}
int mincost(int s,int t,int ver)
{int flow=0,cost=0;while(spfa(s,t,flow,cost,ver));return cost;
}int n;
int cx[MAX],cy[MAX];
int x[MAX],y[MAX];
int hax[MAX],hay[MAX];
int mmp[100][100];
int main()
{memset(head,-1,sizeof(head));cnt=0;SI(n);for(int i=1;i<=n;i++){SI(x[i]);SI(y[i]);hax[i]=x[i],hay[i]=y[i];}sort(hax+1,hax+n+1);sort(hay+1,hay+n+1);int topx=unique(hax+1,hax+n+1)-hax-1;int topy=unique(hay+1,hay+n+1)-hay-1;rep(i,1,n){int xx=lower_bound(hax+1,hax+1+topx,x[i])-hax;int yy=lower_bound(hay+1,hay+1+topy,y[i])-hay;cx[xx]++;cy[yy]++;mmp[xx][yy]=1;}rep(i,1,topx){rep(j,1,topy){add(i,j+topx,mmp[i][j],1);add(j+topx,i,-mmp[i][j],0);//cout<<xx<<' '<<yy<<' '<<(i==j)<<endl;}}rep(i,1,topx){add(0,i,0,cx[i]);add(i,0,0,0);}rep(i,1,topy){add(i+topx,topx+topy+1,0,cy[i]);add(topx+topy+1,i+topx,0,0);}ll ans=mincost(0,topx+topy+1,topx+topy+1);printf("%lld\n",ans);
}
/*
4
1 1
2 2
3 3
1 3
ans=1
5
1 1
2 2
3 3
4 4
1 4
ans=0
*/

upc 6445: 棋盘V (网络流费用流解决匹配问题)相关推荐

  1. UPC 6445 棋盘

    6445: 棋盘V 时间限制: 1 Sec  内存限制: 128 MB 提交: 325  解决: 31 [提交] [状态] [讨论版] [命题人:admin] 题目描述 有一块棋盘,棋盘的边长为100 ...

  2. 图论-网络流⑦-费用流解题

    图论-网络流⑦-费用流解题 上一篇:图论-网络流⑥-费用流 下一篇:图论-网络流⑧-有上下界的网络流 参考文献: https://www.luogu.com.cn/blog/user9012/solu ...

  3. jzoj3302-[集训队互测2013]供电网络【上下界网络流,费用流,动态加边】

    正题 题目大意 若干个城市一些城市有一定的电,有些城市需要一定的电.对于第iii个城市购买一个电需要iniin_iini​,送出电需要outiout_iouti​.当然城市之间也可以相互传输电. 对于 ...

  4. P2517-订货【网络流,费用流】

    正题 AC链接: https://www.luogu.org/record/show?rid=7949532 大意 有n个月,每个月商品价格di,需求量Ui.有容量为S的仓库,一个商品汇存一个月要m. ...

  5. 图论 —— 网络流 —— 费用流 —— 基于 Dijkstra 的费用流

    [概述] 在求解费用流时,大多数情况都是使用基于 SPFA 的 MCMF 算法,但有时某些毒瘤题会卡 SPFA,此时就要利用基于 Dijkstra 的费用流来求解. [算法原理] 基于 Dijkstr ...

  6. 网络流 费用流 模板 ISAP+SPFA+ZKW

    2020年4月20日重新发布.7年前的文章,几年前CSDN改版的时候变成了私密--重新发一下吧. 关于费用流ZKW算法的讲解:从入门到精通: 最小费用流的"zkw算法" 关于Din ...

  7. 修车——网络流——费用流

    这题很明显的是费用流了,关键是在于建图.其实,网络流的关键也是难点就在于建图. n个师傅,m个车-- 根据题意,需要把每个师傅拆成m个点,每辆车再向这些点连接,再来个超级源点S,超级汇点T即可. 代码 ...

  8. P4249 [WC2007]剪刀石头布(网络流/费用流)

    P4249 [WC2007]剪刀石头布 在一个竞赛图上一些边的方向已经确定,但是还有一些边的方向没有确定,求解最多有多少三元环. 首先看到三元环个数,按照套路我们利用度数计算,然后考虑每一条边,每一条 ...

  9. 图论 —— 网络流 —— 费用流 —— zkw 费用流

    [概述] 求解费用流的方法很多,目前最流行的是 MCMF 费用流,其实质是将 EK 算法中的 bfs 换为了 SPFA 来计算最小费用,但其存在的一个缺点是 EK 是单路增广的,这样速度会相应的慢一些 ...

最新文章

  1. 搞基础理论研究有什么用?
  2. boost::filesystem模块打印文件的大小的测试程序
  3. 点击下载!《阿里云SRE技术期刊》2021年5月刊发布啦!
  4. elasticsearch-jdbc同步myslq数据到elasticsearch
  5. nightwatch testing 注意事项
  6. C 的 6 种内存顺序,你都知道吗?
  7. 不显示调用super_让不懂编程的人爱上iPhone开发(2017秋iOS11+Swift4+Xcode9版)-第11篇
  8. 视觉SLAM十四讲学习笔记——第五讲--相机与图像
  9. 【深度学习笔记】个人阅读的Deep Learning方向的paper整理
  10. 情人节--我们依旧单身(制作属于自己的QQ拼音皮肤)(带全部ps素材)
  11. SVN合并分支到主干(简单易懂)
  12. java试题库管理系统源代码_题库聚合源码_有没有人有试题库管理系统的源代码啊基于java web的_淘题吧...
  13. 第二章-信源与信息熵(一)
  14. 台灯c语言,Jya无线台灯C上手体验:从新界说光的含义
  15. Spring框架介绍
  16. 阿里智能App下架,智能家居平台淘汰赛拉开大幕
  17. flask_web 蓝本基模板继承问题
  18. 极客时间和极客学院_极客需要告诉我们的父母有关安全可靠地在线购物的信息
  19. Echarts实现多个x轴或y轴曲线图
  20. 错误代码:DNS_PROBE_FINISHED_NXDOMAIN解决办法

热门文章

  1. 2020测开面经(字节,阿里,腾讯)
  2. MATLAB修饰线条
  3. git 使用报错 [rejected] master -> master (fetch first)(non-fast forward)
  4. Dm9000aep在u-boot下网卡驱动调试笔记
  5. 猜数字 剪刀石头布
  6. 销售找客户很重要 怎样找企业客户
  7. 飞信提示无法连接服务器未响应,电脑无法连接网络并诊断提示DNS服务器未响应的解决方法...
  8. 数据结构java版本
  9. g++在编译时就确定运行时动态库路径
  10. 卡塔尔世界杯 16 强全部出炉,欧洲占半席、亚足联三队出线,淘汰赛有哪些看点?你看好哪支球队晋级?