图算法---普利姆算法

#include<iostream>
#include<cstring>
#include<climits>
using namespace std;
const int M=500;
int cost[M][M];
int Creat(){
    int n,m;
    cin>>n>>m;
    for(int q=1;q<=n;q++){
        for(int w=1;w<=n;w++)cost[q][w]=INT_MAX;
    }
    int a,b,c;
    for(int q=1;q<=m;q++){
        cin>>a>>b>>c;
        cost[a][b]=c;
        cost[b][a]=c;
    }
    return n;
}
void prim(int n){
    int close[M],lowcost[M];
    for(int q=1;q<=n;q++){
        close[q]=1;
        lowcost[q]=cost[1][q];
    }
    close[1]=-1;
    for(int q=1;q<n;q++){
        int Min=INT_MAX,u=q;
        for(int w=1;w<=n;w++)if(close[w]!=-1 && lowcost[w]<Min){
            Min=lowcost[w];
            u=w;
        }
        cout<<"("<<close[u]<<","<<u<<")"<<" "<<lowcost[u]<<endl;
        for(int w=1;w<=n;w++)if(close[w]!=-1 && lowcost[w]>cost[u][w]){
            lowcost[w]=cost[u][w];
            close[w]=u;
        }
    }
    return;
}
int main() {
    int t;
    cin>>t;
    while(t--){
        int n=Creat();
        prim(n);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/yangmenda/p/11725595.html

时间: 2024-09-29 09:09:10

图算法---普利姆算法的相关文章

普利姆算法(最小生成树)

int prim(){ int minid, i, j; double mincost; for(i = 2; i <= n; i ++){ lowcost[i] = map[1][i]; } lowcost[1] = -1; for(i = 2; i <= n; i ++){ mincost = INF; minid = 0; for(j = 2; j <= n; j ++){ if(lowcost[j] < mincost && lowcost[j] >

(转)最小生成树之普利姆算法、克鲁斯卡尔算法

 最小生成树之prim算法 边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以把边上的权值解释为线路的造价.则最小生成树表示使其造价最小的生成树. 构造网的最小生成树必须解决下面两个问题: 1.尽可能选取权值小的边,但不能构成回路: 2.选取n-1条恰当的边以连通n个顶点: MST性质:假设G=(V,E)是一个连通网,U是顶点V的一个非空子集.若(

数据结构之 普利姆算法总结

Agri-Net Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area.

最小生成树(普利姆算法、克鲁斯卡尔算法)

给定一个加权无向连通图,如何选择一个生成树,使权利的最小总和的边缘所有树,叫最小生成树. 求最小生成树算法 (1) 克鲁斯卡尔算法 图的存贮结构採用边集数组,且权值相等的边在数组中排列次序能够是随意的.该方法对于边相对照较多的不是非常有用,浪费时间. (2) p=1313">普里姆算法 图的存贮结构採用邻接矩阵.此方法是按各个顶点连通的步骤进行,须要用一个顶点集合,開始为空集,以后将以连通的顶点陆续增加到集合中,所有顶点增加集合后就得到所需的最小生成树 . 以下来详细讲下: 克鲁斯卡尔算法

普利姆算法

普里姆(Prim)算法,和克鲁斯卡尔算法一样,求加权连通图的最小生成树的算法. 下面对算法的图例描述 ?

最小生成树普利姆算法

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 20#define INFINITY  0x7ffffffftypedef struct{    int U[MAX][MAX];    char adj[MAX][10];    int vexnum, arcnum;}Graph;typedef struct{    char

最小生成树 - 普利姆算法

#include<cstdlib> #include<cstdio> #include<cstring> #define MAXVEX 100 #define INFINITY 65535 typedef struct { char vexs[MAXVEX]; int arc[MAXVEX][MAXVEX]; int numVextexes,numEdges; }MGraph; void CreateGraph(MGraph *G){ int i,j,k,w; prin

生成最小树(普里姆算法)

普利姆算法生成最小树, 当两个节点之间没有边时,权值为65535,结点与自身之间为0.... #define MAXSIZE 10 typedef struct Graph { int table[MAXSIZE][MAXSIZE]; int num; }Graph; void createTable(Graph *graph); void printTable(Graph *graph); void prim(Graph *graph); int main(int argc, char *ar

数据结构(五) 普利姆与克鲁斯卡尔的最小生成树(Swift面向对象版)

上篇博客我们聊了图的物理存储结构邻接矩阵和邻接链表,然后在此基础上给出了图的深度优先搜索和广度优先搜索.本篇博客就在上一篇博客的基础上进行延伸,也是关于图的.今天博客中主要介绍两种算法,都是关于最小生成树的,一种是Prim算法,另一个是Kruskal算法.这两种算法是很经典的,也是图中比较重要的算法了. 今天博客会先聊一聊Prim算法是如何生成最小生成树的,然后给出具体步骤的示例图,最后给出具体的代码实现,并进行测试.当然Kruskal算法也是会给出具体的示例图,然后给出具体的代码和测试用例.当