Kruskal算法求最小生成树。 要求输出最小生成树的最大权值。最小边数,和各个边。 数据: 记录权值的c,最小生成树的边用r1[],r2[]表示。 算法: Kruskal算法。并查集。 AC代码: #include<iostream> #include<algorithm> using namespace std; int u[15005], v[15005], w[15005], p[1005], r[15005]; int re1[15005], re2[15005]; //re1和re2用于记录最后应输出的顶点。 int cmp(const int i, const int j) {return w[i]<w[j];} int find(int x) {return p[x]==x?x:p[x]=find(p[x]);} int main() { int n, m, c=0; cin>>n>>m; for(int i=1; i<=m; i++) cin>>u[i]>>v[i]>>w[i]; for(int i=1; i<=n; i++) p[i]=i; for(int i=1; i<=m; i++) r[i]=i; sort(r+1, r+m+1, cmp); int k=0; for(int i=1; i<=m; i++) { int e=r[i]; int x=find(u[e]); int y=find(v[e]); if(x!=y) { //c记录mst的最长边。 if(w[e]>c) c=w[e]; re1[k]=u[e]; re2[k++]=v[e]; p[x]=y; } } cout<<c<<endl; cout<<n-1<<endl; //mst的边数一定为n-1。 for(int i=0; i<n-1; i++) cout<<re1[i]<<" "<<re2[i]<<endl; return 0; }