Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- using namespace std;
- const int MAXN = 1000;
- struct Edge
- {
- int from, to, price;
- Edge( int f, int t, int p ) : from(f), to(t), price(p) {}
- bool operator<( const Edge& e ) const
- {
- return price < e.price;
- }
- };
- int N, M, parent[MAXN], rankk[MAXN];
- vector <Edge> edges;
- void input()
- {
- scanf("%d %d", &N, &M);
- int f, t, p;
- for( int i = 0; i < M; i++ )
- {
- scanf("%d %d %d", &f, &t, &p);
- edges.push_back(Edge(f, t, p));
- parent[edges[i].from-1] = edges[i].from-1;
- parent[edges[i].to-1] = edges[i].to-1;
- }
- }
- void union_trees( int from, int to )
- {
- if( rankk[from] == rankk[to] )
- {
- parent[to] = from;
- rankk[from]++;
- }
- else if( rankk[from] < rankk[to] )
- {
- parent[from] = to;
- }
- else
- {
- parent[to] = from;
- }
- }
- int find( int node )
- {
- if( parent[node] == node )
- {
- return node;
- }
- return parent[node] = find(parent[node]);
- }
- void kruskal()
- {
- sort(edges.begin(), edges.end());
- int i = 0, ans = 0, br = 0;
- while( br < N-1 )
- {
- int p1 = find(edges[i].from);
- int p2 = find(edges[i].to);
- if( p1 != p2 )
- {
- union_trees(p1, p2);
- br++;
- ans += edges[i].price;
- }
- i++;
- }
- printf("%d\n", ans);
- }
- int main()
- {
- input();
- kruskal();
- return 0;
- }
- /**
- 6 10
- 1 2 1
- 3 6 1
- 3 1 2
- 3 2 4
- 1 6 3
- 5 3 2
- 3 4 1
- 4 5 1
- 4 2 10
- 2 5 1
- **/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement