您的位置:首页 > 其它

prim写法 最小生成树

2012-11-30 14:13 417 查看
http://blog.csdn.net/qinaide_lixiaoshuo/article/details/7882355

马上要回家了,复习复习我学习过的知识,

prim写的最小生成树,其实prim和dijkstra是非常相似的,只不过是dijkstra更新的是和而已,,,

所以两个算法很相似,,只不过是吧dis[]=map[][]+dis[] 变成了 dis[]=map[][],当然 同样变化的还有判断条件;

贴出代码:

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define inf 0x3fffffff

int N;

int map[105][105];

int visit[105];

int dis[105];

int prim()
{
for(int i=1;i<=N;i++)
dis[i]=inf;
dis[1]=0;
for(int j=1;j<=N;j++)
{
int t=inf;
int pos;
for(int i=1;i<=N;i++)
{
if(!visit[i]&&t>dis[i])
{
t=dis[i];
pos=i;
}
}
visit[pos]=1;
for(i=1;i<=N;i++)
{
if(!visit[i]&&map[pos][i]!=0x3f3f3f3f&&dis[i]>map[pos][i])
{
dis[i]=map[pos][i];
}
}
}
int sum=0;
for(i=1;i<=N;i++)
{
sum+=dis[i];
}
return sum;
}

int main()
{
while(scanf("%d",&N),N)
{
int M=(N-1)*N>>1;
int a,b,val;
memset(map,0x3f,sizeof(map));
memset(visit,0,sizeof(visit));
for(int i=1;i<=M;i++)
{
scanf("%d%d%d",&a,&b,&val);
if(map[a][b]>val)
{
map[a][b]=val;
map[b][a]=val;
}
}
int ans=prim();
printf("%d\n",ans);
}
return 0;
}


 

以下是我的:

#define N 6
#define NUM 6
#define MAX 100
std::string vexs
;
int edge

;//边表
int edgenum;

int prim(int v)
{
 int visited
;
 int dist
;
 for(int i=0;i<N;i++)
  dist[i]=MAX;
 for(int i=0;i<N;i++)
 {
  if(edge[v][i]<MAX)
  {
   dist[i]=edge[v][i];
  }
  visited[i]=0;
 }
 visited[v]=1;
 dist[v]=0;
 int min;int pos;
 for(int j=1;j<N;j++)
 {
  min=MAX;
  pos=0;
  for(int i=0;i<N;i++)
  {
   if(visited[i]==0&&dist[i]<min)
   {
    min=dist[i];
    pos=i;
   }
  }
  visited[pos]=1;
  //松弛
  for(int i=0;i<N;i++)
  {
   if(!visited[i]&&edge[pos][i]<dist[i])
   {
    dist[i]=edge[pos][i];
   }
  }
 }
 int sum=0;
 for(int i=0;i<N;i++)
  sum+=dist[i];
 return sum;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: