代码如下带有注释:
欢迎交流
#include<iostream>
#include<cstdio>#include<cstring>
#include<algorithm>
using namespace std;
int select(int shortedge[],int n)
{
int k,i,min1=9999;
for(i=1;i<n;i++)
if(shortedge[i]!=0&&shortedge[i]<min1) {min1=shortedge[i];k=i;}
return k;
}
struct point
{
int w; //为图的弧长;
int from,to;
bool operator<(const point b) const
{
return this->w<b.w;
}
};
class MGraph //无向图;
{
public:
int e,v;//边的数量,点的数量;
int arc[100][100]; //邻接矩阵;
point p[100]; //p为边集;
MGraph(int x,int y);//x点,y边;
void Kruskal();
void Prim();
};
MGraph::MGraph(int x,int y)
{
v=x;
e=y;
int i,j,k,t;
for(i=0;i<x;i++) //初始化全为9999;
for(j=0;j<x;j++)
arc[i][j]=9999;
for(k=0;k<y;k++)
{
cin>>i>>j>>t; //录入边的两个点和边的权值;
p[k].from=i;
p[k].to=j;
p[k].w=t;
arc[i][j]=t;
arc[j][i]=t;
}
}
void MGraph::Prim()
{
int i,j,k,min1=0;
int shortedge[100];
for(i=0;i<v;i++)
{
shortedge[i]=arc[i][0];
}
shortedge[0]=0; //将0点加入最小生成树;
for(i=1;i<v;i++) //还要加入v-1个点;
{
k=select(shortedge,v);
min1+=shortedge[k];
shortedge[k]=0;
for(j=1;j<v;j++)
{
if(arc[j][k]<shortedge[j]) shortedge[j]=arc[j][k];
}
}
cout<<min1<<endl;
}
int findroot(int parent[],int v)
{
while(parent[v]!=-1)
v=parent[v];
return v;
}
void MGraph::Kruskal()
{
int i;
int x,y,num=0,min1=0;
int parent[100];
for(i=0;i<v;i++) //初始化每个点都属于不同的联通分量;
parent[i]=-1;
sort(p,p+e);
for(i=0;i<e;i++)
{
x=findroot(parent,p[i].from);
y=findroot(parent,p[i].to);
if(x!=y) //下标为x,y的点不属于同一个联通分量;
{
min1+=p[i].w;
parent[y]=x;
num++;
if(num==v-1) break;
}
}
cout<<min1<<endl;
}
int main()
{
int n,e;
cin>>n>>e;
MGraph M(n,e);
cout<<endl;
M.Prim();
cout<<endl;
M.Kruskal();
return 0;
}
测试数据如下
4 6
0 1 4
0 2 9
0 3 21
1 3 17
1 2 8
2 3 16
运行截图: