1 #include <stdio.h>
2 #include <string.h>
3 #include <algorithm>
4 using namespace std;
5 const int N=1001;
6 const int inf=1<<29;
7 int w[N][N];
8 int dis[N],flag[N];
9 int n,m,u,v,c;
10 int prim()
11 {
12 int sum=0;//计算最小距离
13 memset(flag,0,sizeof(flag));
14 for(int i=1; i<=n; i++)
15 {
16 dis[i]=w[1][i];//把起点到每个点的距离付给dis
17 }
18 flag[1]=1;
19 for(int i=1; i<n; i++)//会更新n-1次顶点,每个点都会做一次顶点
20 {
21 int to=-1,min1=inf;
22 for(int j=1; j<=n; j++)//从起点开始找,求出各点到以找过的顶点的距离最小值
23 {
24 if(!flag[j]&&dis[j]<min1)//保证不是被使用过的顶点,重新算出此次循环的最小值
25 {
26 to=j;//把最小值对应的点的下标记录下
27 min1=dis[j];
28 }
29 }
30 if(to==-1) return -1;//有断点,不能到达
31 sum+=min1;
32 flag[to]=1;
33 for(int j=1; j<=n; j++)
34 {
35 dis[j]=min(dis[j],w[to][j]);//更新顶点,其中存储着最短的目前找过的顶点与各点之间的距离
36 }//这样方便以后可以直接找到与各点的最短距离,遇到回路也不怕!
37 }
38 return sum;
39
40 }
41 int main()
42 {
43 while(scanf("%d%d",&n,&m)!=EOF)//n个顶点,m条边
44 {
45 for(int i=1; i<=n; i++) //初始化i到j点的距离为无穷大,
46 {
47 for(int j=1; j<=n; j++)
48 {
49 w[i][j]=inf;//i到j,j到i 都要人为的付成是一样的
50 }
51 }
52 for(int i=0; i<m; i++)
53 {
54 scanf("%d%d%d",&u,&v,&c);//起点u,终点v,权值c
55 w[u][v]=w[v][u]=c;
56 }
57 printf("%d\n",prim());
58 }
59 return 0;
60 }