博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4289 Control 最小割
阅读量:7203 次
发布时间:2019-06-29

本文共 2848 字,大约阅读时间需要 9 分钟。

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

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

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

代码:

1 #include
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<<110 #define rson m+1,r,rt<<1|111 #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
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
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 }
View Code

 

转载于:https://www.cnblogs.com/MingSD/p/9735436.html

你可能感兴趣的文章
精准营销的概念以及实施步骤
查看>>
Spring Boot是微服务的入门级框架
查看>>
SQL Server 2008 R2 附加数据库错误
查看>>
特定页面实现旋转效果
查看>>
css基础
查看>>
HDU——2063 过山车
查看>>
洛谷——1508 Likecloud-吃、吃、吃
查看>>
自主服务器详细发布网站教程,能上网即可以做网站服务
查看>>
OpenStack Cinder 块存储服务管理(七)
查看>>
孤寂的城市,孤寂的我
查看>>
在Windows 7的64位系统下将UltraEdit添加到鼠标右键菜单
查看>>
前端性能优化方面建议
查看>>
sql语句
查看>>
我的友情链接
查看>>
weblogic线上业务真实环境故障集锦系列-1
查看>>
每天一个linux命令(26):用SecureCRT来上传和下载
查看>>
7.5 运算符重载
查看>>
把String型的日期 加一天,再变成String型
查看>>
研磨设计模式 之 桥接模式(Bridge)1——跟着cc学设计系列
查看>>
【Android必备】处理Android应用程序链接(15)
查看>>