您的位置:首页 > 其它

匈牙利算法;直接贴来的;理解交替轨的基础上,画图看一下算法流程,发现没有问题;

2010-06-01 22:25 274 查看
#include <stdio.h>
#include <string.h>
#define MAX 102

long n,n1,match;
long adjl[MAX][MAX];
long mat[MAX];
bool used[MAX];

FILE *fi,*fo;

void readfile()
{
fi=fopen("flyer.in","r");
fo=fopen("flyer.out","w");
fscanf(fi,"%ld%ld",&n,&n1);
long a,b;
while (fscanf(fi,"%ld%ld",&a,&b)!=EOF)
adjl[a][ ++adjl[a][0] ]=b;
match=0;
}

bool crosspath(long k)
{
for (long i=1;i<=adjl[k][0];i++)
{
long j=adjl[k][i];
if (!used[j])
{
used[j]=true;
if (mat[j]==0 || crosspath(mat[j]))
{
mat[j]=k;
return true;
}
}
}
return false;
}

void hungary()
{
for (long i=1;i<=n1;i++)
{
if (crosspath(i))
match++;
memset(used,0,sizeof(used));
}
}

void print()
{
fprintf(fo,"%ld",match);
fclose(fi);
fclose(fo);
}

int main()
{
readfile();
hungary();
print();
return 0;
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/akof1314/archive/2009/08/07/4421262.aspx


 

 

hungry()里尚未操作的顶点,它们不可能被匹配,所以循环操作就不可以,不用判断,因为这种情况坚决不可能发生..画图试一下极限情况...

crossPath对一线连得情况直接记录,对于N折线连的将会实现匹配的交错修改.

 

代码太成熟了...现在大体了解,会用就好.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 include file