现在的位置: 首页 > 综合 > 正文

最小生成树模板

2018年03月17日 ⁄ 综合 ⁄ 共 1241字 ⁄ 字号 评论关闭
prim算法(矩阵形式):

#define inf 0x3f3f3f3f
int prim(int n,int sta)//n表示有n个顶点,sta表从sta这个顶点出发生成最小生成树
{
    int
mark[M],dis[M];
    int i,sum =
0;    
//sum是总的最小生成树边权值
    for (i = 0;i
< n;i ++) //初始化dis[i] 表从顶点sta到点i的权值
    {
       
dis[i] = mat[sta][i];
       
mark[i] = 0;
    }
    mark[sta] =
1;          
//sta 这个顶点加入最小生成树中
    for (i = 1;i
< n;i ++)  
//循环n-1次,每次找出一条最小权值的边 n个点的图
   
                      
//只有n-1条边
       
int min =
inf;      
//inf 表无穷大
       
for (j = 0;j < n;j ++)//找出当前未在最小生成树中边权最小的顶点
           
if (!mark[j] && dis[j] < min)
               
min = dis[j],flag = j;
       
mark[flag] =
1;        
//把该顶点加入最小生成树中
       
sum +=
dis[flag];      
//sum加上其边权值
       
for (j = 0;j < n;j ++) 
//以falg为起点更新到各点是最小权值
           
if (dis[j] > mat[flag][j])
               
dis[j] = mat[flag][j];
    }
    return
sum;      
//返回边权总和
}

prim算法(边表形式):

struct Edge//frm为起点,to为终点,w为边权,nxt指向下一个顶点
{
   // int frm;
    int
to,w,nxt;
}edge[M];

int vis[M],head[M],dis[M];
void addedge (int cu,int cv,int cw)//生成边的函数
{
   
//edge[e].frm = cu;
    edge[e].to =
cv;
    edge[e].w =
cw;
    edge[e].nxt
= head[cu];
    head[cu] = e
++;
   
//edge[e].frm = cv;
    edge[e].to =
cu;
    edge[e].w =
cw;
    edge[e].nxt
= head[cv];
    head[cv] = e
++;
}

int prim(int n,int sta) //n为顶点数量,sta为起点
{
    int sum =
0;
   
memset(dis,0x3f,sizeof(dis));
   
memset(vis,0,sizeof(vis));
    for (i =
head[sta];i != -1;i = edge[i].nxt)//遍历与sta点相连的所有顶点
    {
  

【上篇】
【下篇】

抱歉!评论已关闭.