hdu1102------------------------还是畅通工程

这道题还是用用prim,模板题。和1233畅通工程很类似。做1233时很顺手,做这道时,稍有不同。

题中说明,有些路已经修好,不用再修了。求还要最少修多长的路才能全部连通。kao,刚开始想想歪了,不知道怎么处理那些已经联好的路。又是用邻接矩阵,又是用并查集,相邻好几个代码。都不行,最后看了一眼宪哥的代码。看到他把相连接的两条路之间的距离置为0, 一下就明白了。一改,过了。 中的来说,没变,还是prim算法。

AC代码

#include<stdio.h>
#include<string.h>
int map[101][101];
int low[101];
int visit[101];
int n;

int prim()
{
 int i,j,k,pos,min;
 int result=0;
 memset(visit,0,sizeof(visit));
 pos=1;
 visit[pos]=1;
 for(i=1;i<=n;i++)
 {
  if(i!=pos)
  {
   low[i]=map[pos][i];
  }
 }
 for(i=1;i<n;i++)
 {
  min=10000;
  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 q,a,b;
 while(scanf("%d",&n)!=EOF)
 {
  for(i=1;i<=n;i++)
  {
   for(j=1;j<=n;j++)
   scanf("%d",&map[i][j]);
  }
  scanf("%d",&q);
  for(i=1;i<=q;i++)
  {
   scanf("%d%d",&a,&b);
   map[a][b]=map[b][a]=0;
  }
  prim();
 }
 return 0;
}

posted on 2012-03-17 16:34  hrbust_09zhangyabin  阅读(128)  评论(0编辑  收藏  举报