hdu1233------------------第一道最小生成树prim算法

prim模板

这道题是我同时参考两个模板,才敲出来的!总的说,还行,一次AC!

prim已经理解了,加快进度啊!下午掌握Kruskal算法。

AC代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int map[101][101];
int low[101];           //辅助数组,第 i(i不属于U集合)个点到  U 集合的最短距离
int visit[101];
const int da=100000000;
int n;

int prim()
{
 int result=0;
 int i,j,k;
 int pos;
 int min;
 
 memset(visit,0,sizeof(visit));            //初始化,表示都没访问过
 pos=1;                                        //表示最小树的构造从第一个点开始
 visit[pos]=1;                      //标记第一个点,相当于把第一个点划进 U集合 
 
 for(i=1;i<=n;i++)              //辅助数组low[] 的初始化
 if(i!=pos)   
 {
  low[i]=map[pos][i];
 }
 
 for(i=1;i<n;i++)
 {
  min=da;
  for(j=1;j<=n;j++)
  {
   if(!visit[j]&&min>low[j])
   {
    min=low[j];
    pos=j;
   }
  }
  result+=min;
  visit[pos]=1;
  
  for(j=1;j<=n;j++)
  {
   if(!visit[j]&&map[pos][j]<low[j])
   low[j]=map[pos][j];
  }
 }
 printf("%d\n",result);
 return 0;
}

int main()
{
 int i,j,k;
 int s,e,w;        //start点  end点   weight权
 while(scanf("%d",&n)!=EOF&&n!=0)
 {
  for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
  map[i][j]=da;            //初始化,刚开始都变成无限大,(我现在也不清楚有没有用)
  
  for(i=1;i<=n*(n-1)/2;i++)
  {
   scanf("%d%d%d",&s,&e,&w);
   map[s][e]=map[e][s]=w;
  }
  prim();
 }
 return 0;
}

posted on 2012-03-16 14:44  hrbust_09zhangyabin  阅读(155)  评论(0编辑  收藏  举报