棋盘V

时间限制: 1 Sec  内存限制: 128 MB
提交: 380  解决: 44
[提交] [状态] [讨论版] [命题人: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。

思路:见其他博客!!!

注意:实际数据可能比所给的范围大一点!!!
如果暴力处理数据,要特意把数组开大一点应该才能过!!!
AC代码:
 #include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+;
const int inf=;
vector<int> v[];
struct Edge
{
Edge() {};
Edge(int a,int b,int c,int d,int g,int f)
{
u=a,v=b,cost=c,cap=d,flow=g,next=f;
};
int u,v,cost,cap,flow,next;
} e[];
struct Mcmf
{
int head[maxn],cnt;
int dis[maxn],f[maxn],pre[maxn];
bool vis[maxn];
inline void init()
{
memset(head,-,sizeof(head));
cnt=;
}
inline void add(int u,int v,int cost,int cap,int flow=)
{
e[cnt]=Edge{u,v,cost,cap,flow,head[u]};
head[u]=cnt++;
e[cnt]=Edge{v,u,-cost,,flow,head[v]};
head[v]=cnt++;
}
bool spfa(int s,int t,int &cost,int &flow)
{
memset(vis,false,sizeof(vis));
for (int i=; i<maxn; i++)
dis[i]=inf;
queue<int>q;
while(!q.empty()) q.pop();
f[s]=inf;
dis[s]=;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for (int i=head[u]; i!=-; i=e[i].next)
{
int v=e[i].v;
if(e[i].cap>e[i].flow && dis[v]>dis[u]+e[i].cost)
{
dis[v]=dis[u]+e[i].cost;
f[v]=min(f[u],e[i].cap-e[i].flow);
pre[v]=i;
if(!vis[v])
{
vis[v]=;
q.push(v);
}
}
}
}
if(dis[t]==inf)
return ;
cost+=dis[t]*f[t];
flow+=f[t];
for(int u=t; u!=s; u=e[pre[u]].u)
{
e[pre[u]].flow+=f[t];
e[pre[u]^].flow-=f[t];
}
return ;
}
int minCost(int s,int t)
{
int cost=,flow=;
while(spfa(s,t,cost,flow)) ;
return cost;
}
} p;
int main()
{
int s=3e5+,t=3e5+,n,res,sum;
int x[],y[];
p.init();
//for(int i=0;i<=100004;i++) v[i].clear();
scanf("%d",&n);
for(int i=; i<=n-; i++)
{
scanf("%d %d",&x[i],&y[i]);
v[x[i]].push_back(y[i]);
p.add(x[i],y[i]+,,);
}
sort(x,x+n);
sort(y,y+n);
res=x[];
for(int j=; j<=n-; j++)
{
int flag=;
for(int k=; k<v[res].size(); k++)
{
if(v[res][k]==y[j])
{
flag=;
break;
}
}
if(flag)
continue;
if(j==)
p.add(res,y[j]+,,);
if(j> && y[j]!=y[j-])
p.add(res,y[j]+,,);
}
for(int i=; i<=n-; i++)
{
if(x[i]==x[i-])
continue;
else
res=x[i];
for(int j=; j<=n-; j++)
{
int flag=;
for(int k=; k<v[res].size(); k++)
{
if(v[res][k]==y[j])
{
flag=;
break;
}
}
if(flag)
continue;
if(j==)
p.add(res,y[j]+,,);
if(j> && y[j]!=y[j-])
p.add(res,y[j]+,,);
}
}
sum=;
for(int i=; i<=n-; i++)
{
if(x[i]!=x[i-])
{
p.add(s,x[i-],,sum);
sum=;
}
else
sum++;
}
p.add(s,x[n-],,sum);
sum=;
for(int i=; i<=n-; i++)
{
if(y[i]!=y[i-])
{
p.add(y[i-]+,t,,sum);
sum=;
}
else
sum++;
}
p.add(y[n-]+,t,,sum);
printf("%d\n",p.minCost(s,t));
return ;
}
/*
4
1 3
2 3
2 4
2 5 4
*/

棋盘V(最小费用最大流)的更多相关文章

  1. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  2. ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)

    将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...

  3. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  4. P3381 【模板】最小费用最大流

    P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...

  5. 【BZOJ-3876】支线剧情 有上下界的网络流(有下界有源有汇最小费用最大流)

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 502[Submit][Status ...

  6. hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***

    题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙,          每个逮捕队伍在每个城市可以选 ...

  7. UVa11082 Matrix Decompressing(最小费用最大流)

    题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看 ...

  8. UVa12092 Paint the Roads(最小费用最大流)

    题目大概说一个n个点m条带权有向边的图,要给边染色,染色的边形成若干个回路且每个点都恰好属于其中k个回路.问最少要染多少边权和的路. 一个回路里面各个点的入度=出度=1,那么可以猜想知道各个点如果都恰 ...

  9. POJ3686 The Windy's(最小费用最大流)

    题目大概说要用m个工厂生产n个玩具,第i个玩具在第j个工厂生产要Zij的时间,一个工厂同一时间只能生成一个玩具,问最少的用时. 这题建的图不是很直观.. 源点向玩具连容量1费用0的边 将每个工厂拆成n ...

随机推荐

  1. 机房重构——泛型和“DataTable”

    前言 我们都知道在机房重构的时候,大多数都在用七层进行重构,每一层都依赖实体.所以不管怎么调用,返回的应该是实体参数,这样才符合大多数的逻辑,这样我们试想一下,如果我们要求在U层返回多个实体值,怎么办 ...

  2. Spring MVC那点事儿

    自问自答 1 Spring MVC的启动原理? spring mvc是基于ioc容器的,因此需要先创建IOC容器,才能创建对应的spring mvc执行环境. IOC容器是通过ContextLoade ...

  3. C#网络编程学习(5)---Tcp连接中出现的粘包、拆包问题

    本文参考于CSDN博客wxy941011 1.疑问 我们使用第四个博客中的项目. 修改客户端为:连接成功后循环向服务器发送从1-100的数字.看看服务器会不会正常的接收100次数据. 可是我们发现服务 ...

  4. c#之 quartz的学习

    目录: 一. Quartz的API 二.Trigger 的使用 三.使用 JobDataMap 来往Job中传值 四. Calendars 五.SimpleTrigger 六.CronTrigger ...

  5. PureComponent

    前言 React15.3中新加了一个 PureComponent 类,PureComponent 也就是纯组件,取代其前身 PureRenderMixin , PureComponent 是优化 Re ...

  6. flask数据操纵

    Flask ORM 在Django框架中内部已经提供ORM这样的框架,来实现对象关系映射,方便我们操作数据库.如果想在Flask中也达到这样效果,需要安装一个第三方来支持. SQLAlchemy是一个 ...

  7. retrying模块的安装及使用

    安装retrying模块: win10用户在联网的情况下直接在cmd.exe里面键入"pip install retrying"  即可安装retrying模板 在网页正常浏览的过 ...

  8. UIScrollView嵌套滑动手势冲突的简易实现

    明确需求 现在有较多的商城类app有如下需求,界面上带有headerView,并且有一个barView可悬停,最下方为多个可左右滑动的tableView,具体可参考下图 另类实现 在网上关于此类需求的 ...

  9. Apache服务器配置虚拟域名

    我在别处发的帖子 http://www.52pojie.cn/thread-599829-1-1.html

  10. 030 Substring with Concatenation of All Words 与所有单词相关联的字串

    给定一个字符串 s 和一些长度相同的单词 words,找出 s 与 words 中所有单词(words 每个单词只出现一次)串联一起(words中组成串联串的单词的顺序随意)的字符串匹配的所有起始索引 ...