//hlog 9958 最小生成树,prim算法 #include<iostream> using namespace std; const int Max=100,Maxval=INT_MAX; bool visited[Max]; int dist[Max]; struct Graph{ int mat[Max][Max]; int vexnum; void Creategraph(int n,int m); }; void Graph::Creategraph(int n,int m) { int i,j,a,b,c; vexnum=n; for(i=0;i<vexnum;i++){//每一条边赋初值; for(j=0;j<vexnum;j++) { mat[i][j]=Maxval;//一开始假设每一对顶点之间都是没边 } mat[i][i]=0;//自己到自己为0 } for(i=0;i<m;i++) { cin>>a>>b>>c;//输入a到b有边,权值是c; a--;//题目下标从一开始,我们是从零 b--; mat[a][b]=c; mat[b][a]=c; } } int Minvertex(int vexnum)//dist数组里找一个最小值,要求没被访问过 { int i,k=-1; int min=Maxval; for(i=0;i<vexnum;i++) { if(dist[i]<min&&visited[i]==false) { min=dist[i]; k=i; } } return k; } int Prim(Graph G,int u){ int i,v; for(i=0;i<G.vexnum;i++) { dist[i]=G.mat[u][i];//当前顶点的最小权值,不断变化 } fill(visited,visited+G.vexnum,false);//标记数组,一开始全为false; visited[u]=true; for(v=1;v<=G.vexnum-1;v++) { int k=Minvertex(G.vexnum); if(k==-1) break; visited[k]=true; for(i=0;i<G.vexnum;i++) { if(visited[i]==false&&G.mat[k][i]<dist[i]) dist[i]=G.mat[k][i]; } } int res=0; for(i=0;i<G.vexnum;i++) { res+=dist[i]; } return res; } int main() { int n,m,min;//顶点数,边数 while(cin>>n) { if(n==0) break; m=n*(n-1)/2; Graph G;//定义一个图G; G.Creategraph(n,m);//建n个顶点,m条边的图 min=Prim(G,0); cout<<min<<endl; } return 0; }