Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- #include <algorithm>
- struct Edge {
- int u, v, weight;
- bool operator<(Edge const& other) {
- return weight < other.weight;
- }
- Edge (int x ,int y ,int z)
- {
- u = x;
- v = y;
- weight = z;
- }
- };
- vector<int> parent ,ranked;
- void make_set(int v) {
- parent[v] = v;
- ranked[v] = 0;
- }
- int find_set(int v) {
- if (v == parent[v])
- return v;
- return parent[v] = find_set(parent[v]);
- }
- void union_sets(int a, int b) {
- a = find_set(a);
- b = find_set(b);
- if (a != b) {
- if (ranked[a] < ranked[b])
- swap(a, b);
- parent[b] = a;
- if (ranked[a] == ranked[b])
- ranked[a]++;
- }
- }
- int main()
- {
- int n ;
- cout<<"enter vert num "<<endl;
- cin>>n;
- int k;
- cout<<"enter edges num " <<endl;
- cin>>k;
- vector<Edge> edges;
- parent = vector<int>(n);
- ranked = vector<int>(n);
- for( int i =0 ;i<k;i++)
- {
- int x;
- cin>>x;
- int y;
- cin>> y;
- int w;
- cin>>w;
- Edge e(x,y,w);
- edges.push_back(e);
- }
- int cost =0;
- vector<Edge> result;
- for (int i = 0; i < n; i++)
- {
- make_set(i);
- }
- sort(edges.begin(),edges.end());
- for(Edge e : edges)
- {
- if (find_set(e.u) != find_set(e.v)) {
- cout<<"adding "<< e.weight<<endl;
- cost += e.weight;
- result.push_back(e);
- union_sets(e.u, e.v);
- }
- }
- cout<<"cost is "<<cost;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement