Prim 最小生成树 POJ1287(模板)

来源:互联网 发布:过山车大亨3 mac 中文 编辑:程序博客网 时间:2024/06/05 14:45
题目见上一篇博客#include<cstdio>#include<cstring>#define MAXN 55#define MAXINT 0x7fffffffint graph[MAXN][MAXN]; //邻接矩阵 bool visited[MAXN];  //判断每个点是否被访问过 int prim(int n){    int lowCost[MAXN];  //最短路径集合     int i,j;    for(int i=1;i<=n;++i)        lowCost[i]=graph[1][i]; //从第一个点开始     memset(visited,false,sizeof(visited));    visited[1]=true;    lowCost[0]=MAXINT;    int sum=0;    for(int i=1;i<n;++i)    {        int pos=0;        for(j=1;j<=n;++j)        {            if(!visited[j]&&lowCost[pos]>lowCost[j])                pos=j;        }  //寻找最短路径         if(pos==0)            break;        sum+=lowCost[pos];        visited[pos]=true;        for(j=1;j<=n;++j)        {            if(!visited[j]&&graph[pos][j]<lowCost[j])                lowCost[j]=graph[pos][j];  //更新         }    }    return sum; }int main(){    int i,j;    int num,routenum;    while(scanf("%d",&num)&&num){        scanf("%d",&routenum);        for(i=0;i<MAXN-1;++i)  //不相连的结点距离全部置为正无穷             for(int j=0;j<MAXN-1;++j)                graph[i][j]=MAXINT;        for(i=0;i<routenum;++i)            {                int a,b,len;                scanf("%d%d%d",&a,&b,&len);                if(graph[a][b]>len)                    graph[a][b]=graph[b][a]=len;                }               int sum=prim(num);            printf("%d\n",sum);        }    return 0;}
原创粉丝点击