poj 2195 最小費用最大流

2021-07-23 17:23:32 字數 1543 閱讀 9591

///題意:n個人和m個房子,每個房子中要安排乙個人,每個人移動一步費用為1,

///所有人安排房子後需要的金錢的最小值。

///曼哈頓距離:例如在平面上,座標(x1, y1)的i點與座標(x2, y2)的j點的曼哈頓距離為:

/// d(i,j)=|x1-x2|+|y1-y2|.

///建圖:網路流,建乙個超源 0,超匯 e

/// 1> 超源 0 到 所有人建一條邊 ,容量為 1 費用為 0

/// 2> 所有人到所有房子 建一條邊 容量為1,正向費用為用: abs(x人-x房子)+abs(y人-y房子)。

///反向為: -正向

/// 3> 所有房子 到 超匯(e) 建一條邊 , e = 所有人個數 + 所有邊個數 + 1 。容量為 1 ,費用為 0

#include #include #include #include #include #include #define max 210

using namespace std;

struct loc

coordinate[max];

struct edge

;vectorg[max]; ///圖的鄰接表

queueq;

char map[max][max];

int dist[max]; ///記錄最短路徑

int prevv[max]; ///最短路的前驅點

int preve[max]; ///前驅點的後繼點

bool vis[max];

int n,m;

int sh,sm;

int e;

///向圖中增加一條從from到to容量為cap費用為cost的邊

void add_edge(int from,int to,int cap,int cost)

); g[to].push_back((edge));

}int min_cost_flow(int f)///spfa求最短路,並記錄路徑}}

}f-=1;

res+=dist[e];

for(int v=e;v!=0;v=prevv[v]) ///更改路徑流量

}return res;

}int main()

for(i=0;i}

} for(i=0;i}

}} e = sh+sm+1;

for(i=sh+1;iint f = min(sh,sm);

printf("%d\n",min_cost_flow(f));

} return 0;}/*

2 2.m

h.5 5

hh..m

.....

.....

.....

mm..h

7 8...h....

...h....

...h...

mmmhmmmm

...h....

...h....

...h....

0 0*/

poj 2195 最小費用最大流

題意 給出一張圖,m代表人,h代表house,問所以的人走到house裡的最小花費 每步花費1 5 5 hh.m mm.h簡單題目直接 include include include include includeusing namespace std const int m 102 const i...

POJ 2195 最小費用最大流

題目大意 給定一張網格圖,每個人需要回到乙個房子裡並且乙個房子只能容納乙個人,問所有人加起來的最短路徑是多少 題目解析 看到匹配,肯定是網路流了,有個坑點,題目說只要進入乙個房子就不能走了,照道理有的房子是走不到的應該要bfs,然而並沒有,構圖簡單不多說 ac include include inc...

poj 2195 最小費用最大流

題目大意 乙個nxm的地圖,地圖上的橫縱交錯成nxm個交叉點,其中有k個交叉點為房間,k個交叉點為k個小人的初始位置。小人可以在地圖上沿著水平或垂直方向行走,每走一步的代價為1。求這k個小人分別到達k個不同的房間,所花費的總代價的最小值。題目分析 ps 這種有限制條件 比如容量有限制 的問題可以考慮...