Description

匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,

现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的初始点到达目标点

Input

第一行输入N,M代表车站的总个数,及有多少条双向边连接它们

第二行给出两个数a,b,代表匪徒的出发点及目标点.1<=a,b<=N,a<>b.

再下来有N行,给出对第i个车站进行布控所需要的Money,其不超过10 000 000

再下来M行,用于描述图的结构.

2<=n<=200 , 1 <=m<=20000

Output

最少需要多少Money

Sample Input

  1. 5 6
  2. 5 3
  3. 2
  4. 4
  5. 8
  6. 3
  7. 10
  8. 1 5
  9. 1 2
  10. 2 4
  11. 4 5
  12. 2 3
  13. 3 4

Sample Output

  1. 5

Solution

直接拆点跑最小割就好了。

在\(luogu\)还要输出最小割的一种方案,那么可以从\(s\)开始\(bfs\),沿着没流满的路径走,顺便走到的点标上\(visited\),若一条边起点被访问过,终点没有,那么这条边就被割掉了,具体可以考虑下为什么最大流等于最小割。

这里附上求方案的版本。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void read(int &x) {
  4. x=0;int f=1;char ch=getchar();
  5. for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
  6. for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
  7. }
  8. void print(int x) {
  9. if(x<0) putchar('-'),x=-x;
  10. if(!x) return ;print(x/10),putchar(x%10+48);
  11. }
  12. void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
  13. const int maxn = 2e5+10;
  14. const int inf = 1e9;
  15. int n,m,s,t,tot=1;
  16. int head[maxn],dis[maxn];
  17. struct edge{int to,nxt,w;}e[maxn<<1];
  18. void add(int u,int v,int w) {e[++tot]=(edge){v,head[u],w},head[u]=tot;}
  19. void ins(int u,int v,int w) {add(u,v,w),add(v,u,0);}
  20. int bfs() {
  21. memset(dis,-1,sizeof dis);
  22. queue<int > q;q.push(s);dis[s]=0;
  23. while(!q.empty()) {
  24. int x=q.front();q.pop();
  25. for(int i=head[x];i;i=e[i].nxt)
  26. if(e[i].w>0&&dis[e[i].to]==-1) {
  27. dis[e[i].to]=dis[x]+1;
  28. if(e[i].to==t) return 1;
  29. q.push(e[i].to);
  30. }
  31. }
  32. return 0;
  33. }
  34. int dfs(int x,int f) {
  35. if(x==t) return f;
  36. int used=0;
  37. for(int i=head[x];i;i=e[i].nxt)
  38. if(e[i].w>0&&dis[e[i].to]==dis[x]+1) {
  39. int d=dfs(e[i].to,min(f-used,e[i].w));
  40. if(d>0) e[i].w-=d,e[i^1].w+=d,used+=d;
  41. if(used==f) break;
  42. }
  43. dis[x]=-1;return used;
  44. }
  45. int max_flow() {
  46. int flow=0;
  47. for(;bfs();flow+=dfs(s,inf));
  48. return flow;
  49. }
  50. int vis[maxn];
  51. void solve() {
  52. queue<int > q;q.push(s);vis[s]=1;
  53. while(!q.empty()) {
  54. int x=q.front();q.pop();//write(x);
  55. for(int i=head[x];i;i=e[i].nxt)
  56. if(e[i].w>0&&!vis[e[i].to]) q.push(e[i].to),vis[e[i].to]=1;
  57. }
  58. for(int i=2;i<=tot;i+=2) if(vis[e[i^1].to]&&!vis[e[i].to]) printf("%d ",e[i^1].to);puts("");
  59. }
  60. int main() {
  61. read(n),read(m),read(s),read(t);t+=n;
  62. for(int i=1,x;i<=n;i++) read(x),ins(i,i+n,x);
  63. for(int i=1,x,y;i<=m;i++) read(x),read(y),ins(x+n,y,inf),ins(y+n,x,inf);
  64. max_flow();solve();
  65. return 0;
  66. }

[BZOJ1339] [Baltic2008] Mafia / 黑手党的更多相关文章

  1. [BZOJ1163][BZOJ1339][Baltic2008]Mafia

    [BZOJ1163][BZOJ1339][Baltic2008]Mafia 试题描述 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用 ...

  2. bzoj1339[Baltic2008]Mafia*

    bzoj1339[Baltic2008]Mafia 题意: 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控.对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得 ...

  3. BZOJ1163&BZOJ1339[Baltic2008]Mafia——最小割

    题目描述 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警 方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的初始点到达目标 ...

  4. 1339 / 1163: [Baltic2008]Mafia

    1163: [Baltic2008]Mafia Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 96  Solved: 60[Submit][Statu ...

  5. 1163: [Baltic2008]Mafia

    1163: [Baltic2008]Mafia Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 123  Solved: 70[Submit][Stat ...

  6. 【bzoj1163/bzoj1339】[Baltic2008]Mafia 网络流最小割

    题目描述 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的初始点到达目标点 ...

  7. bzoj1339/1163:[Baltic2008]Mafia

    传送门 最小割,割点,模板... 代码: #include<cstdio> #include<iostream> #include<algorithm> #incl ...

  8. [BZOJ1163&1339]Mafia

    [Baltic2008]Mafia 题目 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后, ...

  9. 越狱Season 1-Episode 13: End of the Tunnel

    Season 1, Episode 13: End of the Tunnel -Fernando: The name is John Abruzzi. 名字是John Abruzzi A b r u ...

随机推荐

  1. java对接微信支付

    对接微信扫码支付(模式2),前端使用velocity技术 (1)调用微信支付接口(view层)  此部分业务逻辑部分可以省略 @RequestMapping("/wxpay.htm" ...

  2. Phpstudy2018 集成环境配置虚拟域名访问到Index Of 下

    (1)    Phpstudy是一款php集成开发环境 可随意切换Php的版本以及服务器. Phpstudy的网站根目录默认为WWW目录,那么如果我们想通过虚拟域名访问到Index Of目录来便于查看 ...

  3. python基础小知识,is和==的区别,编码和解码

    1.is和==的区别 1)id() 通过id()我们可以查看到一个变量表示的值在内存中的地址 >>> s1 = "Tanxu" >>> s2 = ...

  4. sort函数

    做项目的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的时间,还很有可能写错.STL里面有个sort函数,可以直接对数组排序,复杂度为n ...

  5. linux实验-基本指令1

    1.root帐号登录,查看/tmp目录,如果/tmp目录下没有子目录myshare,则建立该目录. 2.创建帐号testuser. 3.把myshare目录及其目录下的所有文件和子目录的拥有者该为te ...

  6. HASH算法小结

    一.简述 HASH算法的本质是特征提取——将某种不太好表示的特征,通过某种压缩的方式映射成一个值.这样,就可以优雅解决一部分难以解决的特征统计问题. 同时考虑到hash算法的本质是个概率算法,因此并不 ...

  7. 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(二):Apache安装和配置

    基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django 基于Ubuntu Server 16.04 LTS版本安装和部署Djan ...

  8. 关于 spring-aop理解

    对于Aop 一直理解很是不到位  谈谈自己理解! Aop : Aspect: 切面    joinpoint 连接点  pointCut 切点  Advice 增强  targert 目标对象   w ...

  9. python语法图

  10. MyEclipse - 问题集 - 创建Maven项目,JDK版本默认是1.5

    修改Maven的配置文件settings.xml,增加profile节点,如下所示: <profile> <id>jdk-1.8</id> <activati ...