日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pku 2195 Going Home 最小费最大流问题

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pku 2195 Going Home 最小费最大流问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://poj.org/problem?id=2195

題意是:有相同數量的人與房子,每一時刻人都可以花費1$的錢走一步,問讓每個人到達一個屋子的最少需要的費用。

建立源點與匯點,求有源點到匯點的最小費用最大流;改了一下不需要f[][]的模板。

#include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <cstdlib> #define maxn 207 using namespace std;const int inf = 999999999;struct node {int x,y; }p[maxn],h[maxn]; int c[maxn][maxn],f[maxn][maxn],w[maxn][maxn]; int pre[maxn],dis[maxn]; int n,m,pn,hn,s,t; char str[maxn][maxn]; bool inq[maxn]; int ans;int Abs(int x) {return x > 0 ? x : -x; } void spfa() {int v;queue<int>q;for (int i = 0; i < maxn; ++i){dis[i] = inf; pre[i] = -1;inq[i] = false;}q.push(s); inq[s] = true; dis[s] = 0;while (!q.empty()){int u = q.front(); q.pop();inq[u] = false;for (v = 0; v <= t; ++v){if (c[u][v]&& dis[v] > dis[u] + w[u][v]){dis[v] = dis[u] + w[u][v];pre[v] = u;if (!inq[v]){q.push(v);inq[v] = true;}}}} } void mcmf() {while (1){spfa();if (pre[t] == -1) break;int x = t,minf = inf;while (pre[x] != -1){minf = min(minf,c[pre[x]][x]);x = pre[x];}x = t;while (pre[x] != -1){c[pre[x]][x] -= minf;c[x][pre[x]] += minf;ans += minf*w[pre[x]][x];x = pre[x];}} } int main() {//freopen("in.txt","r",stdin);int i,j,pn,hn;while (~scanf("%d%d",&n,&m)){if (!n && !m) break;pn = hn = 0;for (i = 0; i < n; ++i){scanf("%s",str[i]);for (j = 0; j < m; ++j){if (str[i][j] == 'H'){h[++hn].x = i; h[hn].y = j;}else if (str[i][j] == 'm'){p[++pn].x = i; p[pn].y = j;}}}memset(c,0,sizeof(c));memset(f,0,sizeof(f));memset(w,0,sizeof(w));s = 0; t = pn + hn + 1;for (i = 1; i <= pn; ++i) c[s][i] = 1;for (i = 1; i <= hn; ++i) c[i + pn][t] = 1;for (i = 1; i <= pn; ++i){for (j = 1; j <= hn; ++j){c[i][j + pn] = 1;w[i][j + pn] = Abs(p[i].x - h[j].x) + Abs(p[i].y - h[j].y);w[j + pn][i] = -w[i][j + pn];}}ans = 0;mcmf();printf("%d\n",ans);}return 0; }

  

總結

以上是生活随笔為你收集整理的pku 2195 Going Home 最小费最大流问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。