王岐9.25-贪心:Prim;匈牙利算法-西工大算法

  他讲的这个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;
}

 

你可能感兴趣的:(算法设计与分析,西工大,王岐,算法)