圖是一種基礎又重要的數據結構,圖的生成樹是圖的一個極小連通子圖。最小生成樹是無向連通網的所有生成樹中邊的權值之和最小的一棵生成樹。求圖的最小生成樹可以牽引出很多經典的題目,例如在N個城市之間建立通訊網絡,問怎樣最省經費(不同城市之間的聯繫網的費用不同,也即是邊上的權值不同)。
(1) U={u0}(u0屬於V), TE={ }
(2) 在所有uU,vV-U的邊(u,v)E 中找一條代價最小的邊(u0,v0)併入集合TE, 同時v0併入U,
(3) 如果U≠V,轉(2) (直到U=V爲止)
最後:TE中必有n-1條邊,則T=(V,{TE})爲N的最 小生成樹。
struct{
VerTexType adjvex; //最小邊在U中的那個頂點
ArcType lowcost; //最小邊上的權值
}closedge[MVNum];
#include<iostream>
using namespace std;
typedef struct
{
int cost;
char v1,v2;
}Edge;
char temp[100];
int flag=0;
int check(char k,int m)
{
int i;
for(i=0;i<m;i++)
{
if(temp[i]==k)
return 1;
}
return 0;
}
int main()
{
int i,j,n,m;
Edge edges[100],t;
cout<<"輸入頂點數和邊數:";
cin>>m>>n;
cout<<"依次輸入多組v1 v2 cost:"<<endl;
for(i=0;i<n;i++)
{
cin>>edges[i].v1>>edges[i].v2>>edges[i].cost;
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(edges[i].cost>edges[j].cost)
{
t=edges[i];
edges[i]=edges[j];
edges[j]=t;
}
}
}
for(i=0;i<n;i++)
{
if(check(edges[i].v1,m)==0 || check(edges[i].v2,m)==0)
{
cout<<edges[i].v1<<"---"<<edges[i].v2<<" "<<edges[i].cost<<endl;
if(check(edges[i].v1,m)==0)
{
temp[flag]=edges[i].v1;
flag++;
}
if(check(edges[i].v2,m)==0)
{
temp[flag]=edges[i].v2;
flag++;
}
}
}
return 0;
}