#include <bits/stdc++.h>
using namespace std;
#define MAXV 50
typedef struct
{
int no;//顶点编号
char info;//顶点其他信息
} vertextype;
typedef struct //图的定义
{
int edges[MAXV][MAXV];//邻接矩阵
int n,e;//顶点、边数
vertextype vexs[MAXV];//存放顶点信息
} mgraph;
typedef struct edge
{
int u,v,w;
/* edge(int a,int b,int c):u(a),v(b),w(c){}
bool operator<(const edge& a)const{//权值升序
return this->w>a.w;}
*/
} edge;
void insertsort(edge *E,int n)
{
int k;
for(int i=1;i<=n;i++){
k=i;
for(int j=i;j<=n;j++){
if(E[k].w>E[j].w){
int x,y,z;
x=E[k].u;y=E[k].v;z=E[k].w;
E[k].u=E[j].u;E[k].v=E[j].v;E[k].w=E[j].w;
E[j].u=x;E[j].v=y;E[j].w=z;
}
}
}
}
void kruskal(mgraph g)
{
int i,j,u1,v1,sn1,sn2,k=1,length=0;
int vset[MAXV];
edge E[MAXV*MAXV];//存放所有边
for(i=1; i<=g.n; i++) //由g产生的边集E
for(j=1; j<=g.n; j++)
{
if(g.edges[i][j]!=0&&g.edges[i][j]!=INT_MAX)
{
E[k].u=i;
E[k].v=j;
E[k].w=g.edges[i][j];
k++;
}
}
insertsort(E,g.e);//用直接插入排序对E数组按权值递增排序
for(i=0; i<g.n; i++) //初始化辅助数组
vset[i]=i;
k=1;
j=1;
while(k<=g.n) //生成边数小于n时循环
{
u1=E[j].u;
v1=E[j].v;//取一条边的头尾顶点
sn1=vset[u1];
sn2=vset[v1];//分别得到两个顶点所属的集合编号
if(sn1!=sn2) //两个顶点属于不同的集合
{
cout<<u1<<v1<<E[j].w<<endl;
k++;//生成边数+1
length+=E[j].w;
for(i=1; i<=g.n; i++) //两个集合统一编号
if(vset[i]==sn2)//sn2->sn1
vset[i]=sn1;
}
j++;//扫描下一条边
}
cout<<length;
}
void prim(mgraph g,int v)
{
int lowcost[MAXV];
int length = 0;//带权路径长度
int i,j,k,mi,closest[MAXV];
lowcost[0] = 0;
for (i=0; i<g.n; i++)
{
lowcost[i] = g.edges[v][i];
closest[i]=v;
}
for (i=1; i<g.n; i++)
{
mi=INT_MAX;
for(j=0; j<g.n; j++)
if ( lowcost[j]!=0&& mi> lowcost[j] )
{
mi=lowcost[j];
k=j;
}
// cout<<closest[k]<<k<<mi<<endl;
length+=mi;
lowcost[k]=0;
for(j=0; j<g.n; j++)
if(g.edges[k][j]<lowcost[j]&&lowcost[j]!=0)
{
lowcost[j] =g.edges[k][j];
closest[j]= k;
}
}
cout<<length<<endl;
}
int main()
{
mgraph g;
int n,m,a,b,c;
cin>>n>>m;
g.n=n;
g.e=m;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
g.edges[i][j]=INT_MAX;//初始化边权值为无穷大
for(int i=0; i<m; i++)
{
cin>>a>>b>>c;
g.edges[a][b]=c;
}
prim(g,n);
kruskal(g);
return 0;
}
prim&kruska
Guess you like
Origin blog.csdn.net/weixin_44355876/article/details/89815286
Recommended
Ranking