求最小生成树的prime算法

#include<iostream>
#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;
const int IN = 1000000 ;
int G[105][105];
int path[105][105];
int M,N;
int locost[105];
int parent[105];
int FindMin();
int cost;
void Prime()
{
    for(int i=1; i<=N; i++)
    {
        locost[i] = G[1][i];
        parent[i] = 1;
    }
    locost[1] = 0;
    parent[1] = -1;
    for(int i=1; i<N; i++)
    {
        int k = FindMin();
        if(k)
        {
            cost+=locost[k];
            locost[k] = 0;//把k归入最小生成树
            for(int j=1; j<=N; j++)
            {
                if(locost[j] && G[k][j]<=locost[j])//调整距离
                {
                    locost[j] = G[k][j];
                    parent[j] = k;
                }
            }
        }
        else
            cout<<"error"<<endl;
    }
}
int FindMin()
{
    int Min = IN,k=0;
    for(int i=1; i<=N; i++)
        if(locost[i]&&locost[i]<Min)
        {
            Min = locost[i];
            k=i;
        }
    return k;
}
int main()
{
    cin >> M >>N;
    for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++)
            G[i][j] = IN;
    while(M--)
    {
        int s,d,l;
        cin >> s >> d >> l;
        G[s][d] = l;
        G[d][s] = l;
    }
    cost = 0;
    Prime();
    cout<<cost<<endl;
    return 0;
}

原理是每次把权重最小的边归入最小生成树,然后调整距离。

阅读更多

没有更多推荐了,返回首页