猜测

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集:容量为数字出现次数,费用为0y集->T:容量为数字出现次数,费用为0x集->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】猜测 [费用流]的更多相关文章

  1. [BZOJ1070] [SCOI2007] 修车 (费用流 & 动态加边)

    Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...

  2. hdu-5988 Coding Contest(费用流)

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  3. POJ2195 Going Home[费用流|二分图最大权匹配]

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22088   Accepted: 11155 Desc ...

  4. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 960  Solved: 5 ...

  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 ...

  6. Codeforces 730I [费用流]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给两行n个数,要求从第一行选取a个数,第二行选取b个数使得这些数加起来和最大. 限制条件是第一行选取了某个数的条件下,第二行不能选取对应位置的数. ...

  7. zkw费用流+当前弧优化

    zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...

  8. 【BZOJ-4213】贪吃蛇 有上下界的费用流

    4213: 贪吃蛇 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 58  Solved: 24[Submit][Status][Discuss] Desc ...

  9. 【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 ...

随机推荐

  1. C#异步了解一下

    如何让你的代码在“同一时间”干着两件件事呢?比如说,在初始化加载配置的同时,UI界面能够响应用户的各种点击事件.而不置于卡死,特别是出现如下面这种情况的时候,对于用户来说是很崩溃的.

  2. Linux-Ps命令使用

    ps -ef | grep java ps aux | grep java ps aux 是用BSD的格式来显示Java进程 显示的项目有: USER        PID %CPU %MEM    ...

  3. ASP NET Core ---REST & HTTP GET

    参照 草根专栏- ASP.NET Core + Ng6 实战:https://v.qq.com/x/page/h0764n405ll.html 一.REST (Representational Sta ...

  4. react错误总结

    react-native 错误总结 The development server returned response error code: 500 in react-native https://b ...

  5. ubuntu 14.04 安装opencv 3.0 测试

    安装opencv 前面步骤参考 http://my.oschina.net/u/1757926/blog/293976 主要修改测试代码 1. 先从sourceforge上下载OpenCV的源码 2. ...

  6. ExtJS6.0扩展日期选择控件为也可以选择时间

    PS:ExtJS自带的日期选择控件只能够选择日期,但是现在的需求需要精确到秒,所以在网上搜索了一些例子(大部分是4.0的)作为参考,然后改出了6.0可用的一个日期时间选择控件. 1.找到extjs6. ...

  7. exec族

    在之前我们已经知道用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程的用户空间代码和 ...

  8. lintcode-76-最长上升子序列

    76-最长上升子序列 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列 ...

  9. nodejs安装错误

    network错误: npm ERR! network tunneling socket could not be established, cause=connect ECONNREFUSED 12 ...

  10. [AHOI2013]作业 & Gty的二逼妹子序列 莫队

    ---题面--- 题解: 题目要求统计一个区间内数值在[a, b]内的数的个数和种数,而这个是可以用树状数组统计出来的,所以可以考虑莫队. 考虑区间[l, r]转移到[l, r + 1],那么对于维护 ...