最小生成树(prim算法)--poj1258

来源:互联网 发布:淘宝网买笔和笔蕊 编辑:程序博客网 时间:2024/05/17 21:59

第一次做图论的题目,这是一道最小生成树的入门题,用的是prim算法。

题意:要在村子里连上互联网,从john家作为起点,问最短的路径。

思路:prim算法,use用来标识是否在最小生成树中,dist相当于存储生成树外节点与生成树节点的最短边长。

#include<iostream>#include<climits>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;int farm[105][105];int use[105];int dist[105];int main(){    //freopen("in.txt","r",stdin);    int n;    int sum;    while(cin>>n)    {        memset(use,0,sizeof(use));        sum=0;        for(int i=1; i<=n; i++)            for(int j=1; j<=n; j++)            {                cin>>farm[i][j];                if(i==1)                    dist[j]=farm[i][j];            }        dist[1]=INT_MAX;        use[1]=1;        for(int i=2; i<=n; i++)        {            int temp=1;            for(int j=2; j<=n; j++)                if(dist[j]<dist[temp]&&!use[j])                    temp=j;            use[temp]=1;            sum+=dist[temp];            for(int j=1; j<=n; j++)                if(!use[j])                    dist[j]=min(dist[j],farm[j][temp]);        }        cout<<sum<<endl;    }    return 0;}


这里总结一下prim的过程:

首先是设一个优先队列存储上述的dist值,如果队列非空,从中找出最小值,添加到最小生成树中。然后住处队列中与该节点相连的节点,进行宽松处理,即如果相邻节点到该节点的值小于原来的值的话,则将该值改为到该节点的值。

原创粉丝点击