棋盘V(最小费用最大流)
棋盘V
时间限制: 1 Sec 内存限制: 128 MB
提交: 380 解决: 44
[提交] [状态] [讨论版] [命题人:admin]
题目描述
现在小K要猜哪些格子是特殊格子。她知道所有格子的横坐标和纵坐标,但并不知道对应关系。换言之,她只有两个数组,一个存下了所有格子的横坐标,另一个存下了所有格子的纵坐标,而且两个数组都打乱了顺序。当然,小K猜的n个格子的位置也必须都不相同。
请求出一个最大的k,使得无论小K怎么猜,都能猜对至少k个格子的位置。
输入
接下来n行,每行描述一个特殊格子的位置。第i行含有两个整数xi和yi ,代表第i个格子的坐标。保证任意两个格子的坐标都不相同。
输出
样例输入
2
1 1
2 2
样例输出
0
提示
小K有可能会猜(1,2),(2,1),此时一个都没对
对于30%的数据,n≤8。
另外有5%的数据,所有横坐标和纵坐标均不相同。
另外有15%的数据,所有横坐标或者纵坐标均不相同。
对于100%的数据,n≤50,1≤xi,yi≤100000。
思路:见其他博客!!!
#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(最小费用最大流)的更多相关文章
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
- ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)
将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
- P3381 【模板】最小费用最大流
P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...
- 【BZOJ-3876】支线剧情 有上下界的网络流(有下界有源有汇最小费用最大流)
3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 821 Solved: 502[Submit][Status ...
- hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***
题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙, 每个逮捕队伍在每个城市可以选 ...
- UVa11082 Matrix Decompressing(最小费用最大流)
题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看 ...
- UVa12092 Paint the Roads(最小费用最大流)
题目大概说一个n个点m条带权有向边的图,要给边染色,染色的边形成若干个回路且每个点都恰好属于其中k个回路.问最少要染多少边权和的路. 一个回路里面各个点的入度=出度=1,那么可以猜想知道各个点如果都恰 ...
- POJ3686 The Windy's(最小费用最大流)
题目大概说要用m个工厂生产n个玩具,第i个玩具在第j个工厂生产要Zij的时间,一个工厂同一时间只能生成一个玩具,问最少的用时. 这题建的图不是很直观.. 源点向玩具连容量1费用0的边 将每个工厂拆成n ...
随机推荐
- 洛谷P3694 邦邦的大合唱站队/签到题
P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...
- [Xcode 实际操作]五、使用表格-(1)使用UITableView制作简单表格
目录:[Swift]Xcode实际操作 本文将演示表格视图的使用方法. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首先添加两个协 ...
- [转]AFNetworking 3.0迁移指南
http://www.jianshu.com/p/047463a7ce9b?utm_campaign=hugo&utm_medium=reader_share&utm_content= ...
- 基于ECharts的股票行情分时、K线、MACD、DIF、DEA图表 (绝无仅有)
先上效果图 源码和使用说明已经开源至GitHub,欢迎各位能提出宝贵的意见噢 https://github.com/2557606319/H5-Kline
- Linux 调优方案, 修改最大连接数(ulimit命令)
https://blog.csdn.net/isoleo/article/details/51732687 https://www.cnblogs.com/zengkefu/p/5649407.htm ...
- iconfont的应用
http://www.iconfont.cn/help/platform.html http://www.iconfont.cn/users/project 点击下载之后: 打开demo.html: ...
- Codeforces Round #129 (Div. 2) A
Description The Little Elephant loves Ukraine very much. Most of all he loves town Rozdol (ukr. &quo ...
- C# ThreadLocal
ThreadLocal的主要作用是让各个线程维持自己的变量. .NET 4.0在线程方面加入了很多东西,其中就包括ThreadLocal<T>类型,他的出现更大的简化了TLS的操作.Thr ...
- 【ACM】棋盘覆盖 - 大数除
棋盘覆盖 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...
- Abbreviation ---- hackerrank
---恢复内容开始--- https://www.hackerrank.com/contests/world-codesprint-6/challenges/abbr 给定两个串str和sub. 对于 ...