POJ 2195 (費用流 最小權匹配)

2021-06-25 19:07:53 字數 2006 閱讀 3905

[題目大意]:給出n*m的地圖,由幾個h(房子)和m(人),求每個人都走到乙個房子的最少需要的總步數。

n,m<=100 ;  h==m ;

兩種方法,看心情!

1.最小費用最大流 

算出每個人到每個房子的步數; 

s和每個人連邊,容量1,費用0

每個人和每個房子連邊,容量inf, 費用為步數

每個房子和t連邊,容量1,費用0 ;

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

const int n= 20000 ;

const int max= 100000 ;

const int inf=1<<30 ;

struct node

edge[max];

struct node1

m[n],h[n] ;

int head[n],vist[n],dist[n],pp[n],pre[n] ;

char g[n][n] ;

int top ;

void add(int u ,int v,int c,int cost)

int spfa(int s,int t)

}

}

}

if(dist[t]==inf) return 0;

return 1 ;

}

int mfmc(int s,int t)

flow += minflow;

mincost += dist[t]*minflow ;

// printf("****");

}

return mincost ;

}

int main()

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

for(int j = 0 ; j < k1 ; j++)

//k其實等於k1,房子和人的數量相等

int s = 0 , t = k+k1+1 ;

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

add(s,i+1,1,0);

for(int i = 0 ; i

2. 最小權匹配 

每個人和房子連邊,權值為步數的相反數 ,也就是負的 ;

求一遍最大權匹配, 再把答案變回正數 ;

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

const int n= 200 ;

const int inf=1<<30 ;

struct node1

m[n],h[n] ;

int f[n][n] ,lx[n],ly[n],fx[n],fy[n],match[n] ;

char g[n][n] ;

int k,k1;

int dfs(int u)

}} return 0;

}int km()

for(int kk = 1 ; kk <= k ; kk++ ) }

int ans = 0 ;

for(int i = 1 ;i <= k ; i++)

ans += f[match[i]][i] ;

return -ans ;

}int main()

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

for(int j = 0 ; j < k1 ; j++)

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

}

return 0 ;

}

poj 2195(最小費用流)

題意 給你乙個n m的地圖,h代表這個點有乙個房子,m代表這個點是乙個人,每次h走一步就花費一,問最小花費使得每個人能進入乙個房間 建立乙個源點和匯點,每個人和源點相連,每個房子和匯點相連,每個人和每個房子相連,花費為曼哈段距離 include include include include inc...

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 到 所有人...