【普里姆演算法】最小生成樹-例題
阿新 • • 發佈:2019-01-05
對於最小生成樹,我第一次遇到該類例題,從週六到週一,中間斷斷續續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)
{
參考資料: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)
{