传送门

解题思路

  可以发现天兵不用管,答案的一个上界是\(2*k\),就是天兵一个个换。刚开始写了个拆\(6\)点的网络流,调了半天发现自己假了。。说说正解,首先可以发现交换士兵其实就是种类的交换,那么可以对于每一个点算出它距离所有点的距离,距离就是最少换几次,这个可以\(spfa\)求出,之后发现这个很像二分图匹配,可以二分答案表示用几次超能力,然后跑二分图匹配即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>using namespace std;
const int N=105;inline int rd(){int x=0,f=1; char ch=getchar();while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();return f?x:-x;
}int n,m,k,T,val[N][N],dis[N][N],xx[N],yy[N],match[N];
int h[N][N],tx[N],ty[N],dx[4]={0,1,0,-1},dy[4]={1,0,-1,0},ans,tot;
bool vis[N][N],use[N];
queue<int> Q[2];void bfs(int x,int y,int tmp){memset(vis,false,sizeof(vis));memset(dis,0x3f,sizeof(dis));dis[x][y]=0; vis[x][y]=1;Q[0].push(x); Q[1].push(y);int i,j,ii,jj,t;while(Q[0].size()){i=Q[0].front(); Q[0].pop();j=Q[1].front(); Q[1].pop();vis[i][j]=0;for(int k=0;k<4;k++){ii=i+dx[k]; jj=j+dy[k];if(ii<1 || ii>n || jj<1 || jj>m) continue;if((dis[i][j]&1)==tmp){if(h[ii][jj]<h[i][j]) t=1;else t=0;}else {if(h[ii][jj]>h[i][j]) t=1;else t=0;}if(dis[i][j]+t<dis[ii][jj]){dis[ii][jj]=dis[i][j]+t;if(!vis[ii][jj]) Q[0].push(ii),Q[1].push(jj),vis[ii][jj]=1;}}}
}bool dfs(int x,int lim){for(int i=1;i<=tot;i++){if(val[x][i]>lim || use[i]) continue;use[i]=1;if(!match[i] || dfs(match[i],lim)) {match[i]=x; return 1;}}return 0;
}inline bool check(int lim){int ret=0;memset(match,0,sizeof(match));for(int i=1;i<=2*k;i++){memset(use,0,sizeof(use));ret+=dfs(i,lim);}return ret+lim>=2*k;
}int main(){n=rd(),m=rd(),k=rd(),T=rd(); int x,y,z;for(int i=1;i<=2*k+1;i++) xx[i]=rd(),yy[i]=rd();for(int i=1;i<=T;i++){x=rd(),y=rd(),z=rd();while(z--) tx[++tot]=x,ty[tot]=y;}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) h[i][j]=rd();for(int i=1;i<=2*k;i++){if(i<=k) bfs(xx[i],yy[i],0);else bfs(xx[i],yy[i],1);for(int j=1;j<=tot;j++) val[i][j]=dis[tx[j]][ty[j]];}int l=0,r=(k<<1),mid;while(l<=r){mid=(l+r)>>1;if(check(mid)) ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/sdfzsyq/p/10434219.html

BZOJ 2547: [Ctsc2002]玩具兵(二分答案+二分图匹配)相关推荐

  1. bzoj 2547: [Ctsc2002]玩具兵

    2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec   Memory Limit: 128 MB Submit: 351   Solved: 169 [ Submit][ S ...

  2. BZOJ2547 CTSC2002玩具兵(最短路径+二分答案+最大流)

    先不考虑只有一个显得有些特殊的天兵. 可以发现超能力的作用实质上是使兵更换职业.每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地 ...

  3. 题解 [CTSC2002]玩具兵

    这个题我们把三个单位分开讨论 骑兵和步兵:由于一次超能力可以随便换任意次,容易想到对于一个步兵来说走到第 iii 个点其使用超能力的次数应该是一个最短路问题,从 (x1,y1)(x_1,y_1)(x1 ...

  4. bzoj2547 [Ctsc2002]玩具兵 dp+二分匹配

    先手玩几个小结论: 1.步兵一定和骑兵换→走的路径可转化为步兵路径+骑兵路径+步兵路径+...可匹配点 所以相当于求k*2个点到另外2*k个点的最小换次花费,这个用类似spfa的dp可搞 然后天兵只有 ...

  5. BZOJ 2547(匈牙利算法-任意边的处理)

    2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec   Memory Limit: 128 MB Submit: 104   Solved: 50 [ Submit][ St ...

  6. BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)

    字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...

  7. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  8. bzoj 1614 Telephone Lines架设电话线 - 二分答案 - 最短路

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

  9. BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )

    一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...

最新文章

  1. python环境变量配置_?Python项目读取配置的正确姿势
  2. Continue to debug QDD504 read - Service Order extractor debug
  3. 关于Linux自带的python2.6.6升级到2.7.10版本步骤详解及pip、ipython的安装
  4. Python与机器视觉(一)安装与环境
  5. android之WIFI小车编程详述
  6. java充血模型orm框架,关于领域驱动设计和贫血、失血、充血模型
  7. 华为云GaussDB(for openGauss)商用啦!
  8. Unsupported major.minor version 51.0
  9. 实验5.3 编程实现两字符串的连接(使用字符数组)
  10. dma和通道的区别_Java中IO和NIO的本质和区别
  11. sphinx系列之中文分词LibMMSeg安装(三)
  12. Linux各类日志查看
  13. 内存超频时序怎么调_内存超频(ddr4内存时序多少为好)
  14. AccessController的doPrivileged使用
  15. jar脱壳_软件脱壳 - Rannie` - 博客园
  16. c语言情话编程,用c语言编写浪漫情话
  17. Python之读取MongoDB导出的BSON文件
  18. 微信小程序中实现吸顶效果(流畅、不卡顿)
  19. 开发中的各种时间格式转换(三)
  20. request+cheerio+iconv-lite+phantomJs制作简单漫画网站爬虫NodeJs项目

热门文章

  1. INPHO常见问题处理之Orthovista
  2. 万亿级消息背后: 小米消息队列的实践
  3. Java-10.14
  4. 关于ARM的一些简介
  5. 逆势劲增1843%入选德勤中国50强,麻袋财富的生意经 | 一点财经
  6. Eudemon防火墙双机热备配置及实现
  7. 计算机网络中名词解释POP3,计算机网络期末考试 试卷及答案模板
  8. 文字识别软件哪个好?这些软件值得收藏
  9. 小米6 WiFi验证门户中的RCE漏洞
  10. 【Cocos2d-x】Sprite精灵类-创建Sprite精灵对象