⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 l7_7.cpp

📁 数据结构课程的源代码
💻 CPP
字号:
//用普里姆算法求无向网的最小生成树
#include <iostream.h>
const int n=6;            //定义网中顶点数
const int e=10;           //定义网中边数
 struct edgeset           //定义一条生成树的边
{	int fromvex;     //边的起点
	int endvex;      //边的终点
	int weight;      //边上的权值
};
 int s[n+1][n+1];         //网的邻接矩阵
edgeset ct[n+1];    //最小生成树的边集
void prim(edgeset ct[n+1])    
{
	int i,j,k,min,t,m,w;
		for(i=1;i<n;i++) //从顶点1出发求最小生成的树边
	{ ct[i].fromvex=1;
	  ct[i].endvex=i+1;
	  ct[i].weight=s[1][i+1];
	}
    
		for(k=2;k<=n;k++)
		{
			min=32767;
			m=k-1;
	 	  for(j=k-1;j<n;j++)    //找权值最小的树边
	       if(ct[j].weight<min)
		   {min=ct[j].weight;
		    m=j;
		   }
			edgeset temp=ct[k-1];
			ct[k-1]=ct[m];
			ct[m]=temp;
			j=ct[k-1].endvex;
			for(i=k;i<n;i++)     //重新修改树边的距离
			{ t=ct[i].endvex;
			w=s[j][t];
			if(w<ct[i].weight)//原来的边用权值较小的边取代
			{ct[i].weight=w;
			 ct[i].fromvex=j;
			}
			}
		   }
		}

void main()
{ int j,w;
  for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
		  if(i==j) s[i][j]=0;
		  else s[i][j]=32767;//若(i,j)边上无权值,用32767来代替
for(int k=1;k<=e;k++)   //建立网的邻接矩阵
{ cout<<"请输入一条边及边上的权值";
  cin>>i>>j>>w;
  cout<<endl;
  s[i][j]=w;
  s[j][i]=w;
}

prim(ct);//用普里姆算法求最小生成树
  for(i=1;i<n;i++)//输出n-1条生成树的边
  { cout<<ct[i].fromvex<<"  ";
    cout<<ct[i].endvex<<"  ";       
	cout<<ct[i].weight<<endl;;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -