【最小生成树】拜年

题目:拜年 rqnoj142

题目描述

题目描述:
拜年是中国人少不了的风俗.还没过年呢,刚上小学的妮妮已经等不及要给她的小伙伴去拜年了,但是她不知道如何规划才会使自己走的路最少.所以请叫您咯,她不想落下任何一位伙伴.为了走少花精力,她想走最少的路程去所有伙伴的家里.您将得到一份各伙伴家路程的列表,您必须找出能走最少路程去所有小伙伴家的最少路程.

输入格式

输入文件第一行为妮妮小伙伴的个数,n(3<=n<=100)
下面是一个n*n的矩阵,表示每个小伙伴家的距离d(d<=100000),可以保证所有小伙伴都相互认识.

输出格式

只有一个输出为要去所有小伙伴家要走的最少路程

样例输入

样例输出

 

很裸的最小生成树

C++ Code

#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 100+10
#define oo 99999;
int dist[MAX],map[MAX][MAX],n;
bool h[MAX];

int main()
{
  freopen("rqn142.in","r",stdin);
  freopen("rqn142.out","w",stdout);
  int i,j,x;
  scanf("%d",&n);    
  memset(map,63,sizeof(map));
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
      scanf("%d",&x);
      if(i==j)continue;
      map[i][j]=x;
    }
  memset(dist,63,sizeof(dist));
  dist[1]=0;
  int k,min;
  int total=0;
  for(i=1;i<=n;i++)
  {
    //find min
    k=0;min=oo;
    for(j=1;j<=n;j++)
      if(!h[j] && min>dist[j]){min=dist[j];k=j;}
    //color
    h[k]=true;
    total+=dist[k];
    //renew
    for(j=1;j<=n;j++)
      if(!h[j] && dist[j]>map[k][j])dist[j]=map[k][j];
  }
  printf("%d",total);
  return 0;
}

 

 

posted @ 2012-08-18 20:38  jiangzh  阅读(186)  评论(0)    收藏  举报