bzoj5421

贴一张图

关于对问题的转化:

当两个人交换收藏品时,显然我们进行这个操作是为了得到更优解。

那么一个收藏品是有用的,另一个被换走的收藏品可以当做直接扔掉了。

所以只要保留一个就可以了。

注意边数、点数要开够

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define N 20010
int min(int a,int b){return a<b?a:b;}
int n,m,u,S,T,val[N],d[N],cur[N],fir[N]; bool vis[N];
int cnt,hd[N],nxt[N<<],ed[N],poi[N<<];
int cap[N<<],flow[N<<],ans;
queue <int> h;
void adde(int x,int y,int v1,int v2){
nxt[ed[x]]=++cnt; hd[x]=hd[x]?hd[x]:cnt;
ed[x]=cnt; poi[cnt]=y; flow[cnt]=v1; cap[cnt]=v2;
}
#define to poi[i]
bool bfs(){
memset(vis,,sizeof(vis));
h.push(S); vis[S]=; d[S]=;
while(!h.empty()){
int x=h.front(); h.pop();
for(int i=hd[x];i;i=nxt[i])
if(!vis[to]&&cap[i]>flow[i]){
vis[to]=; d[to]=d[x]+;
h.push(to);
}
}return vis[T];
}
int dinic(int x,int a){
if(!a||x==T) return a;
int F=,f;
for(int &i=cur[x];i&&a;i=nxt[i])
if(d[to]==d[x]+&&(f=dinic(to,min(a,cap[i]-flow[i])))>){
F+=f; flow[i]+=f;
a-=f; flow[i^]-=f;
}
return F;
}
void nect(int x,int y,int v){adde(x,y,,v);adde(y,x,,);}//一条边以及它的反向边
int main(){
int TuT;scanf("%d",&TuT);
while(TuT--){
memset(hd,,sizeof(hd));
memset(nxt,,sizeof(nxt));
memset(ed,,sizeof(ed));cnt=;
scanf("%d%d",&n,&m);
S=;T=u=;ans=;
for(int i=;i<=n;++i){
scanf("%d",&val[i]);
nect(S,++u,);fir[i]=u;
}
for(int i=,q1,q2;i<=m;++i){
scanf("%d%d",&q1,&q2);
nect(fir[q1],++u,val[q1]);fir[q1]=u;
nect(fir[q2],++u,val[q2]);fir[q2]=u;
nect(fir[q1],fir[q2],);
nect(fir[q2],fir[q1],);
}nect(fir[],T,val[]);
while(bfs()){//普通dinic
for(int i=;i<=u;++i) cur[i]=hd[i];
ans+=dinic(S,2e9);
}printf("%d\n",ans);
}return ;
}

bzoj5421:收藏家的更多相关文章

  1. 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 解题报告

    P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题目描述 Bessie the cow, always a fan of shiny objects, has ta ...

  2. 2014年8月25日,收藏家和杀手——面向对象的C++和C(一)

    近期事情特别多,睡眠也都非常晚,有点精神和身体混乱的感觉,所以想写写技术分析文章.让两者的我都调整一下.这篇技术分析文章是一直想写的,当前仅仅是开篇,有感觉的时候就写写,属于拼凑而成,兴许的篇章没有时 ...

  3. 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题解

    P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题目描述 Bessie the cow, always a fan of shiny objects, has ta ...

  4. [USACO16OPEN]钻石收藏家Diamond Collector

    由于相差不超过k才可以放在一起,要判断不超过k这个条件,显然我们需要排序 首先我们需要一个f数组,f[i]意义看代码开头注释, 假设我们可以选择的某一个区间是a[l]~a[r](已排序且最优(最长的意 ...

  5. 【前缀和】【two-pointer】【贪心】洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题解

        解法众多的一道毒瘤题? 题目描述 奶牛Bessie很喜欢闪亮亮的东西(Baling~Baling~),所以她喜欢在她的空余时间开采钻石!她现在已经收集了\(N\)颗不同大小的钻石,现在她想在谷 ...

  6. BZOJ 5421: 收藏家

    传送门 直接搞很复杂,考虑转化问题 题目只要求第1个人最多能获得的物品数量 所以如果一种物品拥有多个和一个是没区别的 那么考虑每种物品对第1个人怎样贡献 显然要经过一些交换最终到达第一个人那里 发现很 ...

  7. 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector

    题目描述 Bessie the cow, always a fan of shiny objects, has taken up a hobby of mining diamonds in her s ...

  8. 洛谷P3143 [USACO16OPEN]钻石收藏家Diamond Collector

    题目描述 Bessie the cow, always a fan of shiny objects, has taken up a hobby of mining diamonds in her s ...

  9. YbtOJ-大收藏家【分层图,最大流】

    正题 题目链接:https://www.ybtoj.com.cn/contest/117/problem/2 题目大意 \(n\)个人,每人有\(a_i\)个属于自己的物品.\(m\)次交换依次进行, ...

随机推荐

  1. SQL简单操作

    删除表数据,保留表结构: delete from employee 将删除所有的记录 delete from employee where lastname = 'May' 这条语句是从emplyee ...

  2. leetcode的注意点

    读懂一个题其实非常非常重要,读懂题包括要读懂题的问题是什么,条件是什么,考察的是什么知识点.所以能够读懂题就已经成功一半了,但是如果没有读懂题目就开始答题,就不假思索地乱写答案,那么会事倍功半,还得返 ...

  3. js并归排序的思路

    并归排序,就是分而治之,将长的数组分解为短的数组,一直分到最后,单个单个数组,我们就认为,只有一个元素的数组是有序的.然后再逐个的合并 1.拆分: 很容易 例如数组  [ 2,4,3,5,1,6,8, ...

  4. np.percentile()

    np.percentile(a, q, axis=None, out=None, overwrite_input=False, interpolation='linear', keepdims=Fal ...

  5. js判断手机是安卓还是ios

    //点击下载按钮判断appDown() { var u = navigator.userAgent; var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac O ...

  6. Mongodb $in $or 性能比较

      MongoDB docs have the answer: "When using $or with <expressions> that are equality chec ...

  7. Oracle查询表占用空间的大小

    select * from (select OWNER, segment_name, segment_type, sum(bytes) mmm from dba_segments where /*ta ...

  8. HTML/HTML5 Input类型&&表单

    1.HTML 中"不常用"input类型中的属性值: disabled:输入字段禁用: maxlength:输入字段的最大字符长度: readonly:输入字符只读,无法修改: s ...

  9. HTTP方法之GET与POST对比

    超文本传输协议(HTTP)的设计目的是保证客户端与服务器之间的通信.最常用的是GET与POST 1.GET方法: 查询字符串(键/值对)是在GET请求的URL中发送的. /test.php?a=val ...

  10. 设计模式之Flyweight(享元)(转)

    Flyweight定义: 避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用? 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大, ...