[題目大意]:給出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 到 所有人...