UVa 1515 Pool construction (最小割)

Posted 7391_KID

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 1515 Pool construction (最小割)相关的知识,希望对你有一定的参考价值。

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=528&page=show_problem&problem=3916

题目大意:给定一个h*w的矩阵,每格是草地(#)或洞(.),可以花费d把一个#变成.,也可以花费f把一个.变成#,最后相邻的#和.之间要隔一个栅栏,每个花费为b.最后边界上必须全部是#,求最少花费.

分析:- - 感觉不容易想到...首先由分隔开#和.以及花费最少,联想到最小割.设置一个s,一个t,s连所有#,权重为d,若#变成.,即把这个点分到T中去,需要把这条边割断;所有.连到t,权重为f;相邻点互相连一条边,权重为b,最后如果一个在S一个在T,则需要把这条边割断.还有边界需要是草地,故把s连到边界,权值设为无穷.最后求一下从s到t的最小割即可.

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<vector>
 5 #include<queue>
 6 typedef long long ll;
 7 using namespace std;
 8 const int maxn=2550,maxm=25500,INF=1000000;
 9 int w,h,d,f,b;
10 
11 struct Edge{
12     int from,to,cap,flow;
13     Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}
14 };
15 
16 struct EdmondsKarp{
17     int n,m;
18     vector<Edge> edges;
19     vector<int> G[maxn];
20     int p[maxn],a[maxn];
21 
22     void init(int _n){
23         this->n=n;
24         this->m=0;
25         for(int i=0;i<maxn;i++)G[i].clear();
26         edges.clear();
27     }
28 
29     void AddEdge(int from,int to,int cap,int flow){
30         edges.push_back(Edge(from,to,cap,flow));
31         edges.push_back(Edge(to,from,0,flow));
32         G[from].push_back(m++);
33         G[to].push_back(m++);
34     }
35 
36     ll Maxflow(int s,int t){
37         ll flow=0;
38         while(1){
39             memset(a,0,sizeof(a));
40             queue<int>Q;
41             Q.push(s);
42             a[s]=INF;
43             while(!Q.empty()){
44                 int x=Q.front();Q.pop();
45                 for(int i=0;i<G[x].size();i++){
46                     Edge &e=edges[G[x][i]];
47                     if(!a[e.to]&&e.cap>e.flow){
48                         p[e.to]=G[x][i];
49                         a[e.to]=min(a[x],e.cap-e.flow);
50                         Q.push(e.to);
51                     }
52                 }
53                 if(a[t])break;
54             }
55             if(!a[t])break;
56             for(int u=t;u!=s;u=edges[p[u]].from){
57                 edges[p[u]].flow+=a[t];
58                 edges[p[u]^1].flow-=a[t];
59             }
60             flow+=a[t];
61         }
62         return flow;
63     }
64 };
65 
66 int main(){
67     int kase;
68     long long ans=0;
69     cin>>kase;
70     while(kase--){
71         ans=0;
72         cin>>w>>h;
73         cin>>d>>f>>b;
74         EdmondsKarp ek;
75         ek.init(w*h+2);
76         char c;
77         for(int i=0;i<w*h;i++){
78             cin>>c;
79             if(i/w==0||i/w==h-1||i%w==0||i%w==w-1){
80                 if(c!=#)ans+=f;
81                 ek.AddEdge(w*h,i,INF,0);
82             }
83             else if(c==#)ek.AddEdge(w*h,i,d,0);
84             else ek.AddEdge(i,w*h+1,f,0);
85             if(i>0&&(i-1)/w==i/w)ek.AddEdge(i,i-1,b,0);
86             if(i<w*h&&(i+1)/w==i/w)ek.AddEdge(i,i+1,b,0);
87             if(i-w>=0)ek.AddEdge(i,i-w,b,0);
88             if(i+w<w*h)ek.AddEdge(i,i+w,b,0);
89         }
90         ans+=ek.Maxflow(w*h,w*h+1);
91         cout<<ans<<endl;
92     }
93     return 0;
94 }

 

以上是关于UVa 1515 Pool construction (最小割)的主要内容,如果未能解决你的问题,请参考以下文章

Uva1515 Pool construction

uva1515 Pool construction

Pytorch: Building 3D Dense Network 遇到错误 Adaptive_avg_pool3d: output_size must be 3

如何在序列中的同一插入上插入序列号?

Windows 上的 Multiprocessing.pool.Pool:CPU 限制为 63?

聊聊tempodb的Pool