好久没有这么一下子ac了,还是水题亲切。 MST,我用的是Kruskal算法 #include<iostream> using namespace std; #define m 55 int set[m]; struct Edge { int lp,rp,dist; }; Edge node[2500]; int cmp(const void *a,const void *b) { return ((Edge *)a)->dist-((Edge *)b)->dist; } int find(int x) { int r,i,j; r=x; while(set[r]!=r) r=set[r]; i=x; while(i!=r) { j=set[i]; set[i]=r; i=j; } return r; } void merge(int a,int b) { if(a<b) set[b]=a; else set[a]=b; } int kruskal(int n,int p) { int weight=0,i,h,k; qsort(node,p,sizeof(node[0]),cmp); for(i=1;i<=n;i++) set[i]=i; for(i=0;i<p;i++) { h=find(node[i].lp); k=find(node[i].rp); if(h!=k) { weight+=node[i].dist; merge(h,k); } } return weight; } int main() { int n,p; while(scanf("%d",&n)) { if(n==0) break; scanf("%d",&p); for(int i=0;i<p;i++) scanf("%d%d%d",&node[i].lp,&node[i].rp,&node[i].dist); printf("%d/n",kruskal(n,p)); } return 0; }