#include<cstdio> #include<algorithm> using namespace std; int fa[200005];//fa[i]:存储i的祖先的数组 int n,m; struct abc {//定义一个结构体 int from,to,w;//from:保存这条边的左端点 //to:保存这条边的右端点 } q[200005];//一条用以存不同边的数组 int getfa(int x) {//寻找x的祖先 if(fa[x] == x)return fa[x];//如果x的祖先是x本身,就返回x else return fa[x] = getfa(fa[x]);//如果不是,就找x的祖先的祖先 } bool cmp(abc x,abc y) {//abc就是结构体的数据类型,相当于int之类的 return x.w < y.w;//帮助sort使它从大到小排列 } int kruskal() { int ans = 0;//记录标记过的边的总数,开始时这个总数是零 for(int i = 1; i <= n; i++) { fa[i] = i;//初始化这个祖先数组 } sort(q+1,q+m+1,cmp);//将所有边按照边权从小到大进行排序,因为cmp就是按照边权排的序 for(int i = 1; i <= m; i++) { int l = getfa(q[i].from);//找q[i]这条边的左端点的祖先 int r = getfa(q[i].to);//找q[i]这条边的右端点的祖先 if(l != r) {//两个祖先不是一个祖先 fa[l] = r;//实行归并操作 ans += q[i].w;//加上这个边的边权 } } return ans;//返回最小的总边权 } int main() { scanf("%d%d",&n,&m); for(int i = 1; i <= m; i++) { scanf("%d%d%d",&q[i].from,&q[i].to,&q[i].w);//进行输入操作 } printf("%d",kruskal());//输出最小的总边权 return 0; }
我知道你们都很强...应该不用我讲吧...
那就直接看代码吧!我的代码很详细的!