题目链接 AC代码 #include<iostream> #include<cstring> using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; int p,r; const int N = 55; int g[N][N]; int dist[N];//点i到集合s的距离,这里的距离是路径最短的 int st[N];//判断点i是否在集合s里面 int prime()//子树延申法 { //要找p次 memset(dist, 0x3f,sizeof dist); memset(st,0, sizeof st); int res = 0;//最小生成树的权值 for(int i=0; i<p; i++) { int t = -1;//点t代表,剩下未选的点中到集合S路径最短的点 for(int j=1; j<=p; j++) { //如果未选,或者 if(!st[j]&&(t==-1||dist[t]>dist[j])) t = j; } //再找第二个点及其以后,如果发现,不连通,则 //不可能有最小生成树 if(i&&dist[t]==INF) return INF; if(i) res+=dist[t]; st[t] = 1;//点t加入集合S for(int j=1; j<=p; j++) { dist[j] = min(dist[j],g[t][j]); } } return res; } int main(){ while(~scanf("%d",&p)&&p) { memset(g,0x3f, sizeof g); scanf("%d",&r); if(r==0) { puts("0"); continue; } for(int i=0; i<r; i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); g[u][v] = g[v][u] = min(g[u][v],w); } printf("%d\n",prime()); } return 0; }