poj 2195 最小費用最大流

2021-09-08 11:25:55 字數 1131 閱讀 5596

題目大意

乙個nxm的地圖,地圖上的橫縱交錯成nxm個交叉點,其中有k個交叉點為房間,k個交叉點為k個小人的初始位置。小人可以在地圖上沿著水平或垂直方向行走,每走一步的代價為1。求這k個小人分別到達k個不同的房間,所花費的總代價的最小值。

題目分析

ps:這種有限制條件(比如容量有限制)的問題可以考慮轉化為網路流。

實現(c++)

#include#include#include#include#include#includeusing namespace std;

#define inf 1 << 25

#define max_node 220

#define max_edge_num 40005

#define min(a, b) aq;

q.push(s);

while (!q.empty())

} }return gpre[t] != -1;

}int mincostflow(int s, int t)

for (u = t; u != s; u = gpre[u])

max_flow += f;

cost += f*gdist[t];

} return cost;

}char gmap[105][105];

vector> ghousvec;

vector> gmanvec;

//建圖

void buildgraph()

for (int i = 0; i < n; i++)

} //匯點 2*n+1,連線各個房間借點到匯點,流量為1,單位費用為0

for (int u = 1; u <= n; u++)

}int main()

else if (tmp == 'm')

}} buildgraph(); //建圖

int cost = mincostflow(0, 2 * ghousvec.size() + 1); //求解最小費用最大流

printf("%d\n", cost);

} return 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 最小費用最大流

題意 n個人和m個房子,每個房子中要安排乙個人,每個人移動一步費用為1,所有人安排房子後需要的金錢的最小值。曼哈頓距離 例如在平面上,座標 x1,y1 的i點與座標 x2,y2 的j點的曼哈頓距離為 d i,j x1 x2 y1 y2 建圖 網路流,建乙個超源 0,超匯 e 1 超源 0 到 所有人...

POJ 2195 最小費用最大流

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