思路:第一种想法:这道题可以转化为求最小费用 设一个超级源点把人连起来,各超级汇点把房间连起来,然后求解
PS:忘了取反,检查了半天!!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define M 105
#define inf 0x3f3f3f3f
int link[M],lx[M],ly[M];
int nv,visx[M],visy[M],dis[M],w[M][M];
char map[M][M];
struct node
{
x,y;
}man[M],home[M];
int DFS (int x)
{
1;
1;y <= nv;y ++)
if (visy[y])
continue;
int t = lx[x] + ly[y] - w[x][y];
if (t == 0)
{
visy[y] = 1;
if (link[y] == -1||DFS(link[y]))
{
link[y] = x;
return 1;
}
}
else if (dis[y] > t)
dis[y] = t;
0;
}
int KM()
{
i,j;
(link,-1,sizeof(link));
(ly,0,sizeof(ly));
<= nv;i ++)
for (j = 1,lx[i] = -inf;j <= nv;j ++)
if (w[i][j] > lx[i])
lx[i] = w[i][j];
1;x <= nv;x ++)
for (i = 1;i <= nv;i ++)
dis[i] = inf;
while (1)
{