题目描述
题目描述:
拜年是中国人少不了的风俗.还没过年呢,刚上小学的妮妮已经等不及要给她的小伙伴去拜年了,但是她不知道如何规划才会使自己走的路最少.所以请叫 您咯,她不想落下任何一位伙伴.为了走少花精力,她想走最少的路程去所有伙伴的家里.您将得到一份各伙伴家路程的列表,您必须找出能走最少路程去 所有小伙伴家的最少路程.
输入格式
输入文件第一行为妮妮小伙伴的个数,n(3<=n<=100)
下面是一个n*n的矩阵,表示每个小伙伴家的距离d(d<=100000),可以保证所有小伙伴都相互认识.
输出格式
只有一个输出为要去所有小伙伴家要走的最少路程
Sample Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
Sample Output
28
这道题有点坑,必需当有向图做,否则爆0
(ds[j]=mp[nd][j];)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <ctime>
#include <cmath>
#define mxn 100+10
#define mx 1<<30
#define loc
using namespace std;
int n;
int mp[mxn][mxn];
int ds[mxn];
int nc[mxn];
void prim()
{
ds[1]=0;
for (int i=2;i<=n;++i)
{
ds[i]=mp[1][i];
nc[i]=1;
}
int tot=0;
for (int i=1;i<=n-1;++i)
{
int min=mx,nd=0;
for (int j=1;j<=n;++j)
if (ds[j]&&min>ds[j])
{
min=ds[j];
nd=j;
}
if (!nd) break;
tot+=min;
ds[nd]=0;
for (int j=1;j<=n;++j)
if (ds[j]&&ds[j]>mp[nd][j])
{
ds[j]=mp[nd][j];
nc[j]=nd;
}
}
printf("%d",tot);
}
int main()
{
#ifdef loc
freopen("拜年.in","r",stdin);
freopen("拜年.out","w",stdout);
#endif
scanf("%d",&n);
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
{
scanf("%d",&mp[i][j]);
if (!mp[i][j]) mp[i][j]=mx;
}
prim();
return 0;
}