他讲的这个prim是根据迪杰特斯拉算法改的,上学期数据结构我忘了自己写没写过prim了,他这种似乎更条理一些,我就写了个主要的函数:
void update()
{
for(i = 1; i <= lenA; i++)
{
if(A[i] != -1 && min > A[i])
{
min = A[i];
minI = i;
}
}
for(i = 1; i <= n; i++)
{
if(map[minI][i])
{
if(A[i] == -1)
{
A[i] = map[minI][i];
A[i].head = i;
}
else
{
if(A[i] > map[minI][i])
{
A[i] = map[minI][i];
A[i].head = i;
}
}
}
}
A[minI] = -1;
}
void prim()
{
A[1] = 0;
int i = 1;
while(i++ <= n - 1)
{
update();
tree[A[minI.head][minI] = 1;
}
}
他匈牙利讲了两节课,讲的十分混乱,而且我又没学过离散数学,所以根本不知道他在说什么,自己看了一下网上的介绍,明白了一些,就大概通过深搜,不断妥协寻找匹配对的方法,这个我也只写了主要的函数:
int path(int i)
{
int j;
for(j = 1; j <= yN; j++)
{
if(map[i][j] && !visited[j])
{
visited[j] = 1;
if(y[j] == 0 || path(y[j]))
{
y[j] = i;
return 1;
}
}
}
return 0;
}
int maxMatch()
{
int i;
int sun = 0;
//此处初始化x,y
for(i = 1; i <= xN; i++)
{
//此处清空visited
sum += path(i);
}
return sum;
}