【Foreign】猜测 [费用流]
猜测
Time Limit: 10 Sec Memory Limit: 256 MB
Description

Input

Output

Sample Input
3
1 1
1 2
2 1
Sample Output
3
explain:
(1,1),(1,1),(2,2)不是一个合法猜测(有相同的格子),因此不管怎么猜总是能全部猜中。
HINT

Main idea
给定了若干个标准点,用这些点的横纵坐标分为x集和y集,定义猜点表示从x集和y集中各选一个,不能猜出重复的点,问在所有合法方案中最少包含上述几个标准点。
Solution
我们看到了这道题目,考虑从费用流的方法下手。
我们从S->x集:容量为数字出现次数,费用为0;y集->T:容量为数字出现次数,费用为0;x集->y集:容量为1,若组合成了标准点则费用为1,否则为0。
然后我们这样连边,又由于题目要的是最少包含几个点,那么显然最小费用最大流就是答案了。
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std; const int ONE = ;
const int INF = ; int n,x,y;
int S,T;
int E[][];
int next[ONE],first[ONE],go[ONE],pas[ONE],Fro[ONE],tot=;
int from[ONE],q[],dist[];
bool vis[ONE];
int tou,wei;
int Ans,w[ONE];
int li[ONE],li_num; struct power
{
int x,y;
}a[ONE],time[ONE],Max; int get()
{
int res,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} void Add(int u,int v,int liu,int z)
{
next[++tot]=first[u]; first[u]=tot; go[tot]=v; w[tot]=z; pas[tot]=liu; Fro[tot]=u;
next[++tot]=first[v]; first[v]=tot; go[tot]=u; w[tot]=-z; pas[tot]=; Fro[tot]=v;
} int Bfs()
{
memset(dist,,sizeof(dist));
dist[S]=; q[]=S; vis[S]=;
tou=; wei=;
while(tou<wei)
{
int u=q[++tou];
for(int e=first[u];e;e=next[e])
{
int v=go[e];
if(dist[v]>dist[u]+w[e] && pas[e])
{
dist[v]=dist[u]+w[e]; from[v]=e;
if(!vis[v])
{
q[++wei]=v;
vis[v]=;
}
}
}
vis[u]=;
}
return dist[T]!=dist[T+];
} void Deal()
{
int x=INF;
for(int e=from[T];e;e=from[Fro[e]]) x=min(x,pas[e]);
for(int e=from[T];e;e=from[Fro[e]])
{
pas[e]-=x;
pas[e^]+=x;
Ans += w[e]*x;
}
} int main()
{
n=get();
for(int i=;i<=n;i++)
{
a[i].x=get(); a[i].y=get();
li[++li_num]=a[i].x; li[++li_num]=a[i].y;
} sort(li+,li+li_num+);
li_num = unique(li+,li+li_num+) - li - ;
S=; T=*li_num+; for(int i=;i<=n;i++)
{
a[i].x = lower_bound(li+,li+li_num+, a[i].x) - li;
a[i].y = lower_bound(li+,li+li_num+, a[i].y) - li;
E[ a[i].x ][ a[i].y ] = ;
time[a[i].x].x++; time[a[i].y].y++;
Max.x = max(Max.x, a[i].x); Max.y = max(Max.y, a[i].y);
} for(int i=;i<=Max.x;i++) if(time[i].x) Add(S,i,time[i].x,);
for(int i=;i<=Max.y;i++) if(time[i].y) Add(i+Max.x,T,time[i].y,); for(int i=;i<=Max.x;i++)
if(time[i].x)
for(int j=;j<=Max.y;j++)
if(time[j].y)
{
if(E[i][j]) Add(i,j+Max.x,,);
else Add(i,j+Max.x,,);
} while(Bfs()) Deal(); printf("%d",Ans); }
【Foreign】猜测 [费用流]的更多相关文章
- [BZOJ1070] [SCOI2007] 修车 (费用流 & 动态加边)
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- POJ2195 Going Home[费用流|二分图最大权匹配]
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22088 Accepted: 11155 Desc ...
- BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 960 Solved: 5 ...
- 洛谷 1004 dp或最大费用流
思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...
- Codeforces 730I [费用流]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给两行n个数,要求从第一行选取a个数,第二行选取b个数使得这些数加起来和最大. 限制条件是第一行选取了某个数的条件下,第二行不能选取对应位置的数. ...
- zkw费用流+当前弧优化
zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...
- 【BZOJ-4213】贪吃蛇 有上下界的费用流
4213: 贪吃蛇 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 58 Solved: 24[Submit][Status][Discuss] Desc ...
- 【BZOJ-3638&3272&3267&3502】k-Maximum Subsequence Sum 费用流构图 + 线段树手动增广
3638: Cf172 k-Maximum Subsequence Sum Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 174 Solved: 9 ...
随机推荐
- .NET中调用不安全代码
.NET中是不允许不安全的代码的,比如指针等.但有些特殊场合还是需要用到指针,这时候就需要在你的代码块上加上unsafe标签.如: 1: unsafe static void Main( ...
- netty源码分析系列文章
netty源码分析系列文章 nettynetty源码阅读netty源码分析 想在年终之际将对netty研究的笔记记录下来,先看netty3,然后有时间了再写netty4的,希望对大家有所帮助,这个是 ...
- 【题解搬运】PAT_A1020 树的遍历
题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder an ...
- 怎样安装Python3
在浏览器地址栏输入https://www.python.org/ 打开Python官网 好了,安装完成了! 可以把安装路径C:\Users\Administrator\AppData\Local\Pr ...
- BZOJ1222[HNOI 2001]产品加工
题面描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工 ...
- ardupilot_gazebo仿真(三)
ardupilot_gazebo仿真(三) 标签(空格分隔): 未分类 创建ROS node 实现对无人机的控制(软件在环) MAVROS MAVROS是ROS中的一个能够连接支持MAVLink地面站 ...
- python xlrd处理表格常用方法
1.导入模块import xlrd2.打开Excel文件读取数据data = xlrd.open_workbook('excelFile.xls')3.使用技巧获取一个工作表 table = data ...
- skip-grant-tables 修改linux的mysql忘记root密码
skip-grant-tables 修改linux的mysql忘记root密码 今天修改mysql中的admin用户权限,在执行update user set host =' %' where use ...
- 有向图的强连通分量——kosaraju算法
一.前人种树 博客:Kosaraju算法解析: 求解图的强连通分量
- winform 根据两点求出线上所有点及画出这条线
找出所有点: 根据斜率按照一个方向递增,求出对应的另一个方向的整数值. Point pStart = new Point(0, 2); Point pEnd = new Point(8, 2); // ...