HDU 4289 Control 最小割

Control

题意:有一个犯罪集团要贩卖大规模杀伤武器,从s城运输到t城,现在你是一个特殊部门的长官,可以在城市中布置眼线,但是布施眼线需要花钱,现在问至少要花费多少能使得你及时阻止他们的运输。

题解:裸的最小割模型,最小割就是最大流,我们把点拆成2个点,然后将原点与拆点建边,流量为在城市建立眼线的费用,然后拆点为出点,原点为入点,将可以到达的城市之间建流量为无穷的边。

最后求出s 到 t的拆点的最大流 那么就是这个题目的答案了。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
 4 #define LL long long
 5 #define ULL unsigned LL
 6 #define fi first
 7 #define se second
 8 #define pb emplace_back
 9 #define lson l,m,rt<<1
10 #define rson m+1,r,rt<<1|1
11 #define lch(x) tr[x].son[0]
12 #define rch(x) tr[x].son[1]
13 #define max3(a,b,c) max(a,max(b,c))
14 #define min3(a,b,c) min(a,min(b,c))
15 typedef pair<int,int> pll;
16 const int inf = 0x3f3f3f3f;
17 const LL INF = 0x3f3f3f3f3f3f3f3f;
18 const LL mod =  (int)1e9+7;
19 const int N = 500;
20 const int M = N*N*4;
21 int head[N], deep[N], cur[N];
22 int w[M], to[M], nx[M];
23 int tot;
24 int n, m, s, t;
25 int u, v, val;
26 void add(int u, int v, int val){
27     w[tot]  = val; to[tot] = v;
28     nx[tot] = head[u]; head[u] = tot++;
29
30     w[tot] = 0; to[tot] = u;
31     nx[tot] = head[v]; head[v] = tot++;
32 }
33 int bfs(int s, int t){
34     queue<int> q;
35     memset(deep, 0, sizeof(deep));
36     q.push(s);
37     deep[s] = 1;
38     while(!q.empty()){
39         int u = q.front();
40         q.pop();
41         for(int i = head[u]; ~i; i = nx[i]){
42             if(w[i] > 0 && deep[to[i]] == 0){
43                 deep[to[i]] = deep[u] + 1;
44                 q.push(to[i]);
45             }
46         }
47     }
48     return deep[t] > 0;
49 }
50 int Dfs(int u, int t, int flow){
51     if(u == t) return flow;
52     for(int &i = cur[u]; ~i; i = nx[i]){
53         if(deep[u]+1 == deep[to[i]] && w[i] > 0){
54             int di = Dfs(to[i], t, min(w[i], flow));
55             if(di > 0){
56                 w[i] -= di, w[i^1] += di;
57                 return di;
58             }
59         }
60     }
61     return 0;
62 }
63
64 int Dinic(int s, int t){
65     int ans = 0, tmp;
66     while(bfs(s, t)){
67         for(int i = 1; i <= 2*n+2; i++) cur[i] = head[i];
68         while(tmp = Dfs(s, t, inf)) ans += tmp;
69     }
70     return ans;
71 }
72 void init(){
73     memset(head, -1, sizeof(head));
74     tot = 0;
75 }
76 int main(){
77     while(~scanf("%d%d", &n, &m)){
78         init();
79         int ss = n*2+1, tt = ss+1;
80         s = ss, t = tt;
81         scanf("%d%d", &ss, &tt);
82         add(s, ss, inf);
83         add(tt+n, t, inf);
84         for(int i = 1; i <= n; i++){
85             scanf("%d", &val);
86             add(i,i+n,val);
87         }
88         for(int i = 1; i <= m; i++){
89             scanf("%d%d",&u,&v);
90             add(u+n,v,inf);
91             add(v+n,u,inf);
92         }
93         printf("%d\n",Dinic(s,t));
94     }
95     return 0;
96 }

原文地址:https://www.cnblogs.com/MingSD/p/9735436.html

时间: 2024-10-16 20:35:16

HDU 4289 Control 最小割的相关文章

HDU - 4289 Control (最小割 MCMF)

题目大意:有一个间谍要将一些机密文件送到目的地 现在给出间谍的初始位置和要去的目的地,要求你在间谍的必经路上将其拦获且费用最小 解题思路:最小割最大流的应用,具体可以看网络流–最小割最大流 建图的话 超级源点–起始城市,容量为INF 城市拆成两点(u, v),容量为监视该城市的代价 能连通的城市连接,容量为INF 目的地和超级汇点相连,容量为INF #include <cstdio> #include <cstring> #include <algorithm> #in

HDU 4289 Control (网络流-最小割)

Control Problem Description You, the head of Department of Security, recently received a top-secret information that a group of terrorists is planning to transport some WMD 1 from one city (the source) to another one (the destination). You know their

HDU 4289 Control (最大流+拆点)

http://acm.hdu.edu.cn/showproblem.php?pid=4289 题目讲的是有一些恐怖分子要从S市去往D市,要求在一些城市中安排特工,保证一定能够抓住恐怖分子,因为安排特工需要一定的费用,所以希望找出最小的花费. 思路:可以把每个城市,即每个点拆分成进来的点和出去的点,如x点分成x和x+n,两点连接的边权值为x点上安排特工的费用.而如果x和y两点有连线,则连接x+n,y,然后求从S市到达D市的最大流.之所以能这样求,是因为在求最大流的过程中每次所更新的流量是所有边中最

hdu 4289 Control(网络流 最大流+拆点)(模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1545    Accepted Submission(s): 677 Problem Description You, the head of Department o

hdu 4289 Control (最大流)

hdu 4289 Control You, the head of Department of Security, recently received a top-secret information that a group of terrorists is planning to transport some WMD 1 from one city (the source) to another one (the destination). You know their date, sour

hdu 4289 Control(最小割 + 拆点)

http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2247    Accepted Submission(s): 940 Problem Description You, the head of Department of Secu

HDU 4289 Control (最小割 拆点)

Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2139    Accepted Submission(s): 904 Problem Description You, the head of Department of Security, recently received a top-secret informati

HDU 4859 海岸线 最小割

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 题解: 这题考察的是最小割. 我们可以这样想:海岸线的长短变化都是E引起的,我们通过把’E'变成'.'或'D'来使海岸线最大化. 我们要算海岸线就是算格子‘.'和格子'D'(在原有地图周围四面都要加’D‘)相邻的面数,要使它最大,就是要使'.'与’.':'D'与'D'相邻的面数最小,而面数最小可以用最小割来做. 现在我们先把格子上的点黑白染色,(i+j)%2==1的为A类,为0的为B类, 在

HDU 3061 Battle(最小割----最大权闭合图)

题目地址:HDU 3061 多校中遇到的最小割的最大权闭合模型花了一上午时间终于看懂啦. 最大权闭合图就是将一些互相有依赖关系的点转换成图,闭合图指的是在图中的每一个点的后继点都是在图内的. 还要明白简单割的概念,就是指所有的割边都与源点或汇点相连.然后让源点与正权点相连,汇点与负权点相连,权值均为其绝对值,有依赖关系的点连一条有向边,如果a必须在b的基础上,那么就连一条a->b的有向边,权值为INF.最后用所有正权值得和减去最小割的值就是答案. 具体证明可看胡伯涛大牛的国家队集训论文<最小割