c语言二分图思路图,求助图论的二分图知识

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#include

#include

#include

using namespace std;

#define min(a,b) ((a)>(b)?(b):(a));

const int MAX = 21;

int n;

int weight [MAX] [MAX];

int lx [MAX], ly [MAX];

bool sx [MAX], sy [MAX];

int match [MAX];

void init (int size);

bool path (int u);

int bestmatch (bool maxsum = true);

int main(){

int n;

int index;

scanf ("%d", &n);

init (n);

index = bestmatch (true);

printf ("%d/n",index);

return 0;

}

void init (int size)

{

n = size;

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

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

scanf ("%d", &weight [i] [j]);

}

bool path (int u)

{

sx [u] = true;

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

{

if (!sy [v] && lx[u] + ly [v] == weight [u] [v])

{

sy [v] = true;

if (match [v] == -1 || path (match [v]))

{

match [v] = u;

return true;

}

}

}

return false;

}

int bestmatch (bool maxsum)

{

int i, j;

if (!maxsum)

{

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

for (j = 0; j < n; j ++)

weight [i] [j] = -weight [i] [j];

}

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

{

lx [i] = -0x1FFFFFFF;

ly [i] = 0;

for (j = 0; j < n; j ++)

if (lx [i] < weight [i] [j])

lx [i] = weight [i] [j];

}

memset (match, -1, sizeof (match));

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

while (1)

{

memset (sx, 0, sizeof (sx));

memset (sy, 0, sizeof (sy));

if (path (u))

break;

int dx = 0x7FFFFFFF;

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

if (sx [i])

for (j = 0; j < n; j ++)

if(!sy [j])

dx = min (lx[i] + ly [j] - weight [i] [j], dx);

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

{

if (sx [i])

lx [i] -= dx;

if (sy [i])

ly [i] += dx;

}

}

int sum = 0;

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

sum += weight [match [i]] [i];

if (!maxsum)

{

sum = -sum;

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

for (j = 0; j < n; j ++)

weight [i] [j] = -weight [i] [j];

}

return sum;

}

@cactuslrd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值