1. 程式人生 > >【普里姆演算法】最小生成樹-例題

【普里姆演算法】最小生成樹-例題

對於最小生成樹,我第一次遇到該類例題,從週六到週一,中間斷斷續續3天時間,犧牲了不少腦細胞,今天終於靠我自己的力量AC了!哈哈,紀念一下~~~~

參考資料:http://wenku.baidu.com/view/71525d2ded630b1c59eeb5bf.html(也是我感覺要比書上更直白、更詳細的資料)

例題來源:南陽理工ACM-OJ:http://acm.nyist.net/JudgeOnline/problem.php?pid=38

//普里姆演算法
#include//memset()
#include
#include
using namespace std;

#define MAX 501
#define X 0
#define Y 1
#define VALUE 2

int map[MAX][MAX];
int prevex[MAX];//記錄與建立最小生成樹可連線的頂點,屬於Tree的標記-1
int lowcost[MAX];//記錄nearvex[i]的權值

void swap(int &a,int &b)
{
    a=a+b;
    b=a-b;
    a=a-b;
}

int Prim(int v,int e)//頂點數,邊數
{
    int i, j, sum = 0;
    int min = 100;
    int a,b;
    for( i=1; i<=e; i++)
    {
        cin >>a >>b;
        //if(b < a)swap(a,b);
        cin >>map[a][b];
        map[b][a] = map[a][b];
    }

    prevex[0] = 1;    //初始頂點為1
    prevex[1] = -1;
    for( i=1; i
    {
        //k = search();
        for( j=1; j<=v; j++)
        {
            if(prevex[0] == j)continue;
            if(!map[prevex[0]][j])continue;
            if(lowcost[j] > 0 && map[prevex[0]][j] > lowcost[j])continue;
            if(prevex[j] != -1)    //如果頂點j不在MST裡
            {
                if(lowcost[j])
                if(lowcost[j] < map[prevex[0]][j])continue;
                lowcost[j] = map[prevex[0]][j];
                prevex[j] = prevex[0];
            }
        }
        //
        min = 100;
        int jj = 0;
        for( j=1; j<=v; j++)
        {
            if(!lowcost[j] || prevex[j] == -1)continue;
            if(lowcost[j] < min)
            {