//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; }