最小生成树模板

prim算法

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int INF=999999999;
double map[55][55],dist[55];
bool visit[55];
int n;

void chu()
{
    for(int i=0;i<=n;i++)
     for(int j=0;j<=n;j++)
     {
         if(i==j) map[i][j]=0;
         else map[i][j]=map[j][i]=INF;
     }
}

double prim()
{
    double ans=0,minn;
    int node;
    memset(visit,false,sizeof(visit));
    node=1;
    for(int i=1;i<=n;i++)
    if(i!=node) dist[i]=map[node][i];
    //dist[1]=0;
    visit[1]=true;
    for(int i=1;i<n;i++)
    {
        minn=INF;
        for(int j=1;j<=n;j++)
        if(visit[j]==false&&dist[j]<minn)
        {
            minn=dist[j];
            node=j;
        }
        ans+=minn;
        visit[node]=true;
        for(int j=1;j<=n;j++)
        if(visit[j]==false&&dist[j]>map[node][j])
        dist[j]=map[node][j];
       // printf("%.2lf\n",ans);
    }
    return ans;
}

int main()
{
    int vi,vj;
    double w,ans;
    while(cin>>n)
    {
        if(n==0) break;
        chu();
        for(int i=1;i<=n*(n-1)/2;i++)
        {
            cin>>vi>>vj>>w;
            if(w<map[vi][vj])
            map[vi][vj]=map[vj][vi]=w;
        }
        ans=prim();
        printf("%.2lf\n",ans);
    }
    return 0;
}

 

posted @ 2016-04-11 20:30  邻家那小孩儿  阅读(129)  评论(0编辑  收藏  举报