最短路-Prim算法

HDU-1233

#include <iostream>
#define INF 1000000
using namespace std;
int Map[105][105];
bool NewNode[105];
bool OldNode[105];
bool UsedNode[105];
int lowcast[105];
int main(int argc, const char * argv[]) {
    int n;
    cin.sync_with_stdio(false);
    while(cin>>n)
    {
        if(n==0)
            break;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                Map[i][j]=Map[j][i]=INF;
        for(int i=1;i<=n;i++)
        {
            NewNode[i]=false;
            OldNode[i]=true;
            lowcast[i]=INF;
        }
        for(int i=1;i<=n*(n-1)/2;i++)
        {
            int a,b,val;
            cin>>a>>b>>val;
            Map[a][b]=Map[b][a]=val;
        }
        int counter=1,pos=1,sum=0;
        while(counter!=n)
        {
            NewNode[pos]=true;
            OldNode[pos]=false;
            for(int i=1;i<=n;i++)
            {
                if(OldNode[i]==true&&Map[pos][i]<lowcast[i])
                    lowcast[i]=Map[pos][i];
            }
            int Min=INF,Minpos;
            for(int i=1;i<=n;i++)
            {
                if(OldNode[i]==true&&lowcast[i]<Min)
                {
                    Minpos=i;
                    Min=lowcast[i];
                }
            }
            pos=Minpos;
            counter++;
                sum+=Min;
        }
        cout<<sum<<endl;

    }
    return 0;
}
时间: 2025-01-08 14:30:39

最短路-Prim算法的相关文章

Prim算法与Dijkstra算法的联系与区别

/* 图结构,邻接矩阵形式 */ ElemType nodes[n]; int edges[n][n]; prim_or_dijkstra( int index, bool usePrim ) /* 起点 */ { int dist[n] = { INF }; /* 从起点开始,到其他所有边的距离 */ int distIndex[n] = { -1 }; int visited[n] = { 0 }; int selected = index; /*选中的点 */ /* 初始化起点的可达边距离

【随便搞搞 1】 prim算法的学习和使用

最小生成树是图论中非常有用的算法. 就不知怎么的就学会的最小生成树~~ 但是最小生成树是什么呢? 标准定义如下:在边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小. 听起来非常的带劲,我们就一起来探讨这一求最小生成树的算法! prim 的四大特征: ●最小生成树算法中prim算法是耗时最长的 ●最小生成树算法中prim算法是适用于求稠密图的 ●最小生成树算法中prime算法最简单易懂 ●请不要多打一个e否则就是prime质数了 例子: P3366 [模板]最小生成树

Highways POJ-1751 最小生成树 Prim算法

Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输出需要添加边的两端点编号即可. 解题思路 这个可以使用最短路里面的Prim算法来实现,对于已经连接的城市,处理方式是令这两个城市之间的距离等于0即可. prim算法可以实现我们具体的路径输出,Kruskal算法暂时还不大会. 代码实现 #include<cstdio> #include<cs

最小生成树问题(prim算法)POJ-1258 Agri-Net

/* 这个题很水,但是,莫名其妙runtime error一晚上,重写了一遍就又没了,很伤心! 题意很简单,大致为n个村庄,连光缆,要求连上所有村庄的长度最短. 输入n,接着是n*n的矩阵,直接用prim算法写就行: */ #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath>

杭电1162--Eddy&#39;s picture(Prim()算法)

Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8070    Accepted Submission(s): 4084 Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to b

hihocoder1097最小生成树(prim算法)

prim算法描述: prim算法的思想和代码都跟dijkstra算法非常相似. 在dijkstra算法中,我们用每次取出未标记集合中到源点最近的点进行标记并更新其邻接点到源点的距离:当d[x]+w<d[y]时更新d[y]=d[x]+w. 而在prim算法中,我们只需要对dijkstra算法稍作改动即可,即只需要改变一下更新操作:当w<d[y]时更新d[y]=w,此时d[y]的含义是节点y连接到最小生成树的边的最小取值.也就是说,从图中某个节点发出了边可能有若干条,而最终将该节点连接到最小生成树

prim算法模板

var g:array[1..10,1..10] of longint; d:array[1..10] of longint; f:array[1..10] of boolean; procedure prim; var i,j,k,min:longint; begin fillchar(g,sizeof(g),0); fillchar(f,sizeof(f),0); for i:=1 to n do d[i]:=g[1,i]; f[1]:=true; for i:=2 to n do begi

最小生成树(prim算法,Kruskal算法)c++实现

1.生成树的概念 连通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树. 生成树是连通图的极小连通子图.所谓极小是指:若在树中任意增加一条边,则将出现一个回路:若去掉一条边,将会使之变成非连通图. 生成树各边的权值总和称为生成树的权.权最小的生成树称为最小生成树. 2.最小生成树的性质用哲学的观点来说,每个事物都有自己特有的性质,那么图的最小生成树也是不例外的.按照生成树的定义,n 个顶点的连通网络的生成树有 n 个顶点.n-1 条边. 3.构造最小生成树,要解决以下两个问题

POJ-3268-最短路(dijkstra算法)

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12494   Accepted: 5568 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X