#include<iostream>
using namespace std;
//該算法的時間複雜度爲O(elge);Kruskal算法的時間主要取決於邊數,它較適合於稀疏圖。
#define MAX_VERTEX_SIZE 15
#define MAX_EDGE_SIZE 15
typedef char vertex;
typedef struct edge
{
int m;
int n;
int w;
}edge,*pEdge;
typedef struct Graph
{
edge e[MAX_EDGE_SIZE+1];
vertex v[MAX_VERTEX_SIZE+1];
int vnum,linenum;
}Graph,*G;
int indexof(G &g,vertex c)
{
for(int i=1;i<=g->vnum;i++)
{
if(c==g->v[i])
return i;
}
return -1;
}
void sort(G &g)
{
for(int i=1;i<g->linenum;i++)
{
for(int j=i+1;j<=g->linenum;j++)
{
if(g->e[j].w<g->e[i].w)
{
swap(g->e[i],g->e[j]);
}
}
}
}
void create_graph(G &g)
{
vertex a,b;
int ind1,ind2;
g=(G)malloc(sizeof(Graph));
cout<<"請輸入頂點的數目"<<endl;
cin>>g->vnum;
for(int i=1;i<=g->vnum;i++)
{
cout<<"請輸入第"<<i<<"個頂點"<<endl;
cin>>g->v[i];
}
cout<<"請輸入邊的數目"<<endl;
cin>>g->linenum;
for(int i=1;i<=g->linenum;i++ )
{
cout<<"請輸入第"<<i<<"條邊的頂點"<<endl;
cin>>a;
cin>>b;
ind1=indexof(g,a);
ind2=indexof(g,b);
g->e[i].m=ind1;
g->e[i].n=ind2;
cout<<"請輸入第"<<i<<"條邊的權值"<<endl;
cin>>g->e[i].w;
}
//打印創建的邊信息
cout<<"創建的邊信息:"<<endl;
for(int i=1;i<=g->linenum;i++)
{
cout<<g->e[i].m<<" "<<g->e[i].n<<" "<<g->e[i].w<<endl;
}
//根據權值由低到高對邊進行排序
sort(g);
cout<<"排序後的邊信息:"<<endl;
for(int i=1;i<=g->linenum;i++)
{
cout<<g->e[i].m<<" "<<g->e[i].n<<" "<<g->e[i].w<<endl;
}
}
void kruskal(G &g)
{
int vp[MAX_VERTEX_SIZE];//vp裏面存放不同連通分量的標籤
int result[MAX_EDGE_SIZE];//加入生成樹的邊爲1,初始化爲0
int m,n,tmp;
for(int i=1;i<=g->vnum;i++)
{
vp[i]=i;//初始時各個連通分量均不相同
}
for(int i=1;i<=g->linenum;i++)
{
result[i]=0;
}
for(int i=1;i<=g->linenum;i++)
{
m=g->e[i].m;
n=g->e[i].n;
if(vp[m]!=vp[n])
{
tmp=vp[n];
for(int j=1;j<=g->vnum;j++)
{
if(vp[j]==tmp)
{
vp[j]=vp[m];
}
}
result[i]=1;
}
}
cout<<"輸出結果 result:"<<endl;
for(int i=1;i<=g->linenum;i++)
{
cout<<result[i]<<" ";
}
cout<<endl;
cout<<"輸出結果 vp:"<<endl;
for(int i=1;i<=g->vnum;i++)
{
cout<<vp[i]<<" ";
}
cout<<endl;
}
void main()
{
G g;
create_graph(g);
system("pause");
kruskal(g);
system("pause");
}
最小生成樹的 克魯斯卡爾算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.