Prime算法的代码

来源:互联网 发布:程序员自我评价怎么写 编辑:程序博客网 时间:2024/04/30 13:11

下面的代码在hiho上测试通过,题目的名字是:最小生成树--Prime算法

该方法的时间复杂度是O(V^2),V是图中的节点数,这里的图是无向图,且连通。

对于稀疏图来说,时间复杂度会变为O(ElogV),E为边数。

下面的代码与挑战程序设计一书中的风格很像,分为两部分:

1.更新结点距离

2.寻找最短距离结点

Prime算法的原理:

将所有结点分为两部分:已在树中和未在树中

从未在树中的结点集合里找一个到已在树中集合距离最短的结点,这里距离指的是相连两点的权值,并将该结点并入已在树中集合,然后用新并入的点更新前面说的距离,然后循环。

#include<stdio.h>#include<algorithm>using namespace std;const int N_MAX=1000;int graph[N_MAX][N_MAX];bool flag[N_MAX];int dis[N_MAX];int N; void init(){fill(dis,dis+N_MAX,10000);fill(flag,flag+N,false);scanf("%d",&N);for(int i=0;i<N;i++)for(int j=0;j<N;j++){scanf("%d",&graph[i][j]);}return ;}int solve(){int res=0;if(N==1 || N==0)return res;int start=0;flag[start]=true;dis[start]=0;int num=N-1;int imin,ipos;while(num){for(int i=0;i<N;i++){if(flag[i]==false){dis[i]=min(dis[i],graph[start][i]);//imin=dis[i];//ipos=i;}}ipos=-1;for(int i=0;i<N;i++){if(!flag[i] &&(ipos==-1 || dis[i]<imin)){ipos=i;imin=dis[i];}}flag[ipos]=true;num--;res+=imin;start=ipos;}return res;}int main(){init();/*for(int i=0;i<N;i++)for(int j=0;j<N;j++){printf("%d ",graph[i][j]);if(j==N-1)printf("\n");}*/printf("%d\n",solve());return 0;}



0 0
原创粉丝点击