Prim算法实现最小生成树

来源:互联网 发布:java中类属变量是什么 编辑:程序博客网 时间:2024/06/06 03:15
Prim算法:    从一个节点出发, 每次找到连接的边, 找到最小权重的边, 将边连接的节点加入集合, 找出集合中所有点连接的边, 在寻找最小边, 知道所有点都被找到.    将图存储在邻接矩阵中.
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int INF = 0x3fffffff;const int maxn = 10001;int n, m;int graph[maxn][maxn];  //将图存储在邻接矩阵中int lowcost[maxn];      //记录邻接点的最短边int visit[maxn];        //标记void readin(){    scanf("%d%d", &n, &m);    int a, b, c;    for(int i = 1; i <= n; ++i)        for(int j = 1; j <= n; ++j)            graph[i][j] = INF;    for(int i = 1; i <= m; ++i){        scanf("%d%d%d", &a, &b, &c);        graph[a][b] = c;        graph[b][a] = c;    }}void init(int start){    for(int i = 1; i <= n; ++i){        lowcost[i] = graph[start][i];        visit[i] = 0;    }}int prim(int start){    int ans = 0;    int min;    init(start);    visit[start] = 1;    for(int i = 1; i <= n; ++i){        min = INF;        int flag = -1;        for(int j = 1; j <= n; ++j){        //找到最小值            if(!visit[j] && min > lowcost[j]){                min = lowcost[j];                flag = j;            }        }        if(flag != -1){            cout << min <<endl;            visit[flag] = 1;            ans += min;                     //权值叠加            for(int j = 1; j <= n; ++j){        //更新lowcost                if(!visit[j] && graph[flag][j] < lowcost[j]){                    lowcost[j] = graph[flag][j];                }            }        }    }    return ans;}int main(){    readin();    int ans = prim(1);    cout << ans <<endl;    return 0;}/*5 61 2 12 3 21 3 21 4 34 3 54 5 3*/
原创粉丝点击