【BZOJ 2324】[ZJOI2011]营救皮卡丘 费用流

本人实行诱骗拐卖(利用自然分层与实际意义),正解拼接补充(充分利用最大流限制(不浪费任何一个走出去的机会而不是不浪费任何一个已有的流)与问题转换)

#include <cstdio>
#include <cstring>
#include <algorithm>
const int N=155;
const int M=20010;
const int K=12;
const int Inf=0x3f3f3f3f;
const int treat=1000000;
const int P=N*2;
const int E=N*N*2;
int n,m,k;
int via[N][N];
struct V{
  int to,next,f,c;
}c[E];
int head[P],t=1;
inline void add(int x,int y,int z,int _){
  c[++t].to=y,c[t].next=head[x],c[t].f=z,c[t].c=_,head[x]=t;
}
int dis[P],anc[P];
int q[P],front,back;
bool in[P];
int S,T;
inline bool spfa(){
  memset(dis,0x3f,sizeof(dis));
  in[S]=true,q[back++]=S,dis[S]=0;
  if(back==P)back=0;
  while(front!=back){
    int x=q[front++];in[x]=false;
    if(front==P)front=0;
    for(int i=head[x];i;i=c[i].next)
      if(c[i].f&&dis[x]+c[i].c<dis[c[i].to]){
        dis[c[i].to]=dis[x]+c[i].c,anc[c[i].to]=i;
        if(!in[c[i].to]){
          q[back++]=c[i].to,in[c[i].to]=true;
          if(back==P)back=0;
        }
      }
  }
  return dis[T]!=Inf;
}
inline int shoot(){
  int f=Inf;
  for(int i=anc[T];i;i=anc[c[i^1].to])f=std::min(f,c[i].f);
  for(int i=anc[T];i;i=anc[c[i^1].to])c[i].f-=f,c[i^1].f+=f;
  return f*dis[T];
}
int main(){
  memset(via,0x3f,sizeof(via));
  scanf("%d%d%d",&n,&m,&k);
  ++n;
  for(int i=1,x,y,z;i<=m;++i){
    scanf("%d%d%d",&x,&y,&z);
    ++x,++y;
    via[x][y]=via[y][x]=std::min(via[x][y],z);
  }
  S=n+n+1,T=n+n+2;
  for(int i=1;i<=n;++i){
    via[i][i]=0;
    add(i,i+n,1,-treat),add(i+n,i,0,treat);
    add(i,i+n,k,0),add(i+n,i,0,0);
    add(i+n,T,k,0),add(T,i+n,0,0);
  }
  for(int a=1;a<=n;++a)
    for(int b=1;b<=n;++b)
      via[a][b]=std::min(via[a][b],via[a][1]+via[1][b]);
  for(int i=2;i<=n;++i){
    for(int a=1;a<=n;++a)
      for(int b=1;b<=n;++b)
        via[a][b]=std::min(via[a][b],via[a][i]+via[i][b]);
    for(int j=1;j<i;++j){
      add(j+n,i,k,via[j][i]);
      add(i,j+n,0,-via[i][j]);
    }
  }
  add(S,1,k,0);
  add(1,S,0,0);
  int ans=0;
  while(spfa())ans+=shoot();
  ans+=n*treat;
  printf("%d",ans);
  return 0;
}
时间: 2024-10-09 14:39:21

【BZOJ 2324】[ZJOI2011]营救皮卡丘 费用流的相关文章

BZOJ 2324: [ZJOI2011]营救皮卡丘( floyd + 费用流 )

昨晚写的题...补发一下题解... 把1~N每个点拆成xi, yi 2个. 预处理i->j经过编号不超过max(i,j)的最短路(floyd) S->0(K, 0), S->xi(1, 0)(从i点继续走), 0->yi(1, distance(0->i))(从0出发), xi->yi(1, distance(i->j))(i点走向j点), yi->T(1, 0)(每个点必须经过至少一次), 然后跑最小费用最大流, 费用即为答案. 写完这道题感觉...只是会

bzoj 2324 [ZJOI2011]营救皮卡丘(floyd,费用流)

2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1777  Solved: 712[Submit][Status][Discuss] Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救

BZOJ 2324: [ZJOI2011]营救皮卡丘

2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2340  Solved: 963[Submit][Status][Discuss] Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救

【BZOJ2324】[ZJOI2011]营救皮卡丘 有上下界费用流

[BZOJ2324][ZJOI2011]营救皮卡丘 Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘.为了方便起见,我们将真新镇视为0号据点,一开始K个人都在0号点. 由于火箭队的重重布防,要想摧毁K号据点,必须按照顺序先摧毁1到K-1号据点,并且,如

P4542 [ZJOI2011]营救皮卡丘(Floyd+网络流)

P4542 [ZJOI2011]营救皮卡丘 乍一看似乎没啥题相似的 仔细一看,$N<=150$ 边又是双向边,似乎可以用Floyd搞 先跑一遍Floyd处理出$dis[i][j]$ 注意到走据点要先走小的才能走大的 也就是说,$i<j<k$时,$dis[i][j]$不能从$k$转移过来 并且实际走路径时,编号也必须从小到大 于是题目转化成了: 给定序列$0,1,2,3,.....,n-1,n$,给出每两个数字之间的转移代价$dis[i][j](i<j)$, 用$k$条从0开始的子序

【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流

原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘.为了方便起见,我们将真新镇视为0号据点,一开始K个人都在0号点. 由于火箭队的重重布防,要想摧毁K号据点,必须

【BZOJ 2324】 [ZJOI2011]营救皮卡丘

Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘.为了方便起见,我们将真新镇视为0号据点,一开始K个人都在0号点. 由于火箭队的重重布防,要想摧毁K号据点,必须按照顺序先摧毁1到K-1号据点,并且,如果K-1号据点没有被摧毁,由于防御的连锁性,小智一行

BZOJ2324 [ZJOI2011]营救皮卡丘 【费用流】

题目 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘.为了方便起见,我们将真新镇视为0号据点,一开始K个人都在0号点. 由于火箭队的重重布防,要想摧毁K号据点,必须按照顺序先摧毁1到K-1号据点,并且,如果K-1号据点没有被摧毁,由于防御的连锁性,小智一行任何一个人进入据点

BZOJ2324 ZJOI2011 营救皮卡丘 最短路+费用流

题意:给定一张无向图,有K个人,每一时刻K个人可以同时走(也可以停在一个节点),在到达i之前必须先到达i-1,求从0到N,K个人走的最小距离和(只需一个人到达即可) 题解: 用Floyd跑出任意两个城市i j间的最短路,更新的前提是k<j(要到达城市j必须先到达1->j-1) 将每个城市拆成两个点A B,u v间连费用为w的边,i为任意一个城市,按如下方式建图: 从A向B连流量为INF费用为0的边,表示一个城市可以经过多次 从S向0B连流量为K费用为0的边,表示最初有K个人从0出发 从iB向T