#include <iostream>
#include <fstream>
using namespace std;
const int MAX=1000;
//邻接矩阵
struct mgraph{
char vexs[20];
int edges[20][20];
int n,e;
};
//创建邻接矩阵
void create(mgraph& g)
{
ifstream infile;
infile.open("C:\\idea\\test.txt",ios::in);
if(!infile.is_open())
cout<<"can't open this file"<<endl;
int i,j,k,w,c;
infile>>c>>g.n>>g.e;
//读取各顶点
for(i=0;i<g.n;i++)
{
infile>>g.vexs[i];
}
//初始化各条边
for(i=0;i<g.n;i++)
{
for(j=0;j<g.n;j++)
{
if(i==j)
{
g.edges[i][j]=0;
}
else
{
g.edges[i][j]=MAX;
}
}
}
//读取各条边
for(k=0;k<g.e;k++)
{
infile>>i>>j>>w;
g.edges[i][j]=w;
if(c==0)
{
g.edges[j][i]=w;
}
}
infile.close();
}
//prim算法
void prim(mgraph g,edge tree[])
{
int i,j,k,temp;
edge t;
//1.初始化树tree
for(i=1;i<g.n;i++)
{
tree[i-1].beg=0;
tree[i-1].en=i;
tree[i-1].length=g.edges[0][i];
}
//2.排序读入边
for(i=0;i<g.n-2;i++)//直接选择排序进行读入边
{
temp=i;
for(j=i+1;j<g.n-1;j++)
{
if(tree[i].length>tree[j].length)
{
temp=j;
}
}
if(temp!=i)
{
t=tree[i];
tree[i]=tree[temp];
tree[temp]=t;
}
//3.重新设置两栖边
for(k=i+1;k<g.n-1;k++)
{
if(g.edges[tree[i].en][tree[k].en]<tree[k].length)
{
tree[k].beg=tree[i].en;
tree[k].length=g.edges[tree[i].en][tree[k].en];
}
}
}
//输出最小生成树
for(i=0;i<g.n-1;i++)
{
cout<<g.vexs[tree[i].beg]<<' '<<g.vexs[tree[i].en]<<' '<<tree[i].length<<endl;
}
}
//kruskal算法
void quicksort(edge edgens[],int left,int right)//快速排序
{
int i,j;
edge temp;
i=left;j=right;temp=edgens[i];
if(left<right)
{
while(i<j)
{
while(i<j&&temp.length<edgens[j].length)
j--;
if(i<j)
edgens[i++]=edgens[j];
while(i<j&&temp.length>edgens[i].length)
i++;
if(i<j)
edgens[j--]=edgens[i];
}
edgens[i]=temp;
quicksort(edgens,left,i-1);
quicksort(edgens,i+1,right);
}
}
int getedges(mgraph g,edge edgens[])//读取边
{
int i,j,k=0;
for(i=0;i<g.n;i++)//无向图:读取下三角或上三角即可
{
for(j=0;j<i;j++)//读取下三角
{
if(g.edges[i][j]!=0&&g.edges[i][j]!=MAX)
{
edgens[k].beg=i;edgens[k].en=j;
edgens[k].length=g.edges[i][j];k++;
}
}
}
return k;
}
void kruskal(mgraph g)
{
int i,j,k;
edge tree[20];
edge edgens[20*20];
//1.读取各边
k=getedges(g,edgens);
//2.对各边进行排序
quicksort(edgens,0,k-1);
//3.设计标志,选入边
int cnvx[20];
for(i=0;i<g.n;i++)//对各标志初始化
{
cnvx[i]=i;
}
j=k=0;
int ltf;
while(j<g.n-1)
{
while(cnvx[edgens[k].beg]==cnvx[edgens[k].en])
k++;
tree[j]=edgens[k];
ltf=cnvx[edgens[k].beg];
for(i=0;i<g.n;i++)
if(cnvx[i]==ltf)
cnvx[i]=cnvx[edgens[k].en];
k++;
j++;
}
//输出最小生成树
for(i=0;i<g.n-1;i++)
{
cout<<g.vexs[tree[i].beg]<<' '<<g.vexs[tree[i].en]<<' '<<tree[i].length<<endl;
}
}
int main()
{
mgraph g;
edge tree[20];
prim(g,tree);
cout<<endl;
kruskal(g);
return 0;
}
08-05
08-05
08-05