#include<bits/stdc++.h>
int edge[1005][1005];//用邻接矩阵表示的图
int book[1005];//已确定的节点集合
int dis[1005];//最短路径
int shor[1005];//进入树的点的上一个点
int num=0;//节点的总个数
int prim(int s) {
int pos, min;//pos记录每次确定下来要加入集合book的那个节点,min表示当前这轮确定的最短路径
int MST = 0;//累加最短路径,表示最短路径和
book[s] = 1;//首先,将节点s放入集合book
pos = s;
for (int i = 1; i <= num; i++) //初始化dis
dis[i] = edge[pos][i];
//执行n-1次
for (int i = 2; i <= num; i++) {
min = INT_MAX;
for (int j = 1; j <= num; j++) {
if (book[j]==0 && min > dis[j]) {
min = dis[j];
pos = j;
}
}
book[pos] = 1;//确定选择出离当前节点最近的那个节点
printf("%d -> %d\n",shor[pos],pos);
MST += min;//加上这条最短路径
for (int j = 1; j <= num; j++) //尝试更新dis
if (book[j]==0 && dis[j] > edge[pos][j]){//更新条件:j点未访问,加入新点后已访问集合到j的距离变小了
dis[j] = edge[pos][j];
shor[j] = pos; //记录进入树的点上一个最短点
}
}
return MST;
}
int main() {
int n;
int i,m,j;
while(~scanf("%d",&n)) {
for(i=1;i<=n;i++) {
book[i]=0;
dis[i]=0;
shor[i] = 1;
for(j=1;j<=n;j++) {
edge[i][j]=INT_MAX;
}
}
num = n;
printf("请输入几号到几号有边,权值是多少,以0 0 0结束\n"); //输入图
while(scanf("%d %d %d",&i,&j,&m),i!=0){ //生成邻接矩阵
edge[i][j] = edge[j][i] = m;
}
int ans = prim(1); //特殊生成 只以1为根的生成
printf("%d\n",ans);
}
return 0;
}
int edge[1005][1005];//用邻接矩阵表示的图
int book[1005];//已确定的节点集合
int dis[1005];//最短路径
int shor[1005];//进入树的点的上一个点
int num=0;//节点的总个数
int prim(int s) {
int pos, min;//pos记录每次确定下来要加入集合book的那个节点,min表示当前这轮确定的最短路径
int MST = 0;//累加最短路径,表示最短路径和
book[s] = 1;//首先,将节点s放入集合book
pos = s;
for (int i = 1; i <= num; i++) //初始化dis
dis[i] = edge[pos][i];
//执行n-1次
for (int i = 2; i <= num; i++) {
min = INT_MAX;
for (int j = 1; j <= num; j++) {
if (book[j]==0 && min > dis[j]) {
min = dis[j];
pos = j;
}
}
book[pos] = 1;//确定选择出离当前节点最近的那个节点
printf("%d -> %d\n",shor[pos],pos);
MST += min;//加上这条最短路径
for (int j = 1; j <= num; j++) //尝试更新dis
if (book[j]==0 && dis[j] > edge[pos][j]){//更新条件:j点未访问,加入新点后已访问集合到j的距离变小了
dis[j] = edge[pos][j];
shor[j] = pos; //记录进入树的点上一个最短点
}
}
return MST;
}
int main() {
int n;
int i,m,j;
while(~scanf("%d",&n)) {
for(i=1;i<=n;i++) {
book[i]=0;
dis[i]=0;
shor[i] = 1;
for(j=1;j<=n;j++) {
edge[i][j]=INT_MAX;
}
}
num = n;
printf("请输入几号到几号有边,权值是多少,以0 0 0结束\n"); //输入图
while(scanf("%d %d %d",&i,&j,&m),i!=0){ //生成邻接矩阵
edge[i][j] = edge[j][i] = m;
}
int ans = prim(1); //特殊生成 只以1为根的生成
printf("%d\n",ans);
}
return 0;
}