作为个人的第一篇博客,我还是必须要说些什么的!
首先,今天是我写博客的第一天,然后在以后的时间里我还是会把以前学的一些算法整理后再写在博客上的;
然后,就是我的第一篇文章了,其实也就是结题报告,个人也没想到第一篇博客会是结题报告,总之了,以后的博客就是解题报告和算法讲解了!
最后,也就不讲废话了,附上代码(由于时间关系这次就不写解析了)!
# include <iostream>
# include <cstdio>
# include <string>
# include <cstring>
using namespace std;
const int inf = 0xfffff;
const int maxx = 102; ///这里是定义常量maxx方便后面使用
int map[maxx][maxx];
int dis[maxx];
bool vis[maxx];
int prim(int n) ///核心内容n为最小生成树的大小
{
int sum=0;
memset(vis,0,sizeof(vis)); ///先把标记bool全部赋值为0
for(int i=1; i<=n; i++)
{
dis[i] = map[1][i]; ///先初始化距离
}
vis[1] = 1;
for(int i=1; i<n; i++)
{
int minn = inf, k;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&minn>dis[j])
{
minn = dis[j];
k = j;
}
}
sum = sum + minn; ///sum为最短路程总和,所以每次都要加上最短的路径
if(minn==inf) return -1; ///如果minn等于inf就表示没有最短的路径,要退出搜索,此题可不加(因为这题没作要求)
vis[k] = 1;
for(int j=1; j<=n; j++) ///这里是用来更新最小生成树的路径的
{
if(dis[j]>map[k][j])
dis[j] = map[k][j];
}
}
return sum;
}
int main()
{
int n;
int m;
while(scanf("%d",&n)&&n)
{
m = ((n-1)*n)/2;
int a, b, c;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(i==j) map[i][j] = 0;
else map[i][j] = inf;
}
}
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)
{
map[a][b] = map[b][a] = c;
}
}
int d = prim(n);
printf("%d\n",d);
}
return 0;
}