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 ",prim()); 58 } 59 return 0; 60 }