11.19算法学习打卡

约 88 个字 54 行代码 预计阅读时间 1 分钟

算法打卡一定要打卡
考完期中,开运动会放了几天假,这几天也没学,一直在玩粥和鸣潮
上学期数据结构与算法没有好好学,自己逃避的东西还是会来找上你。
消耗了多于两倍的时间,最后还记不住拿不出手,
Kruskal算法

C++
#include<bits/stdc++.h>
using namespace std;
using LL = long long;

vector<int>father;
vector<int>resultu;
vector<int>resultv;
vector<int>resultw;
struct edge {//定义边结构体
    int u, v;
    LL weight;
};
bool cmp(edge a, edge b) {
    return a.weight > b.weight;
}
int findfather(int x) {  //寻找父节点
    while (father[x] != x) {
        x = father[x];
    }
    return x;
}
void kruskal(int n,vector<edge> Edge) {
    father.resize(n);
    sort(Edge.begin(), Edge.end(), cmp);
    for (int i = 0; i < n; i++) {
        father[i] = i;  //初始化并查集
    }
    for (int i = 0; i < Edge.size() && resultw.size() < n - 1 ; i++) {
        int u = Edge[i].u;
        int v = Edge[i].v;
        if (findfather(u) != findfather(v)) {
            resultu.push_back(u);
            resultv.push_back(v);
            resultw.push_back(Edge[i].weight);
            father[findfather(v)] = father[findfather(u)];
        }
    }
    for (int i = 0; i < resultw.size(); i++) {
        cout << resultu[i] << " " << resultv[i] << " " << resultw[i] << endl;
    }//输出最小生成树
}

int main() {
    int n;
    int m;
    int c;
    cin>>n>>m>>c;
    vector<edge> edges(m);
    for(int i=0;i<m;i++) {
        cin>>edges[i].u>>edges[i].v>>edges[i].weight;
    }
    kruskal(n,edges);
    return 0;
}

评论