Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //1
- #include<iostream>
- #include<limits.h>
- using namespace std;
- int main() {
- int n, m;
- int res = 0;
- cin >> n >> m;
- int g[n][n];
- int edge_to[n];
- int used[n];
- for(int i=0;i<n;i++){
- for(int j=0;j < n;j++){
- g[i][j] = INT_MAX;
- }
- edge_to[i] = INT_MAX;
- used[n] = 0;
- }
- edge_to[0] = 0;
- for (int i = 0; i < m; i++) {
- int x, y, value;
- cin >> x >> y >> value;
- g[x - 1][y - 1] = value;
- g[y - 1][x - 1] = value;
- }
- for (int i = 0; i < n; i++) {
- int new_v = -1;
- for (int j = 0; j < n; j++) {
- if (used[j] != 1 && (new_v == -1 || edge_to[j] < edge_to[new_v])) {
- new_v = j;
- }
- }
- used[new_v] = true;
- for (int to = 0; to < n; to++) {
- if (g[new_v][to] < edge_to[to]) {
- edge_to[to] = g[new_v][to];
- }
- }
- }
- for (int i = 0; i < n; i++) {
- res += edge_to[i];
- }
- cout << res;
- }
- //2
- #include<iostream>
- using namespace std;
- int p[1000000];
- int w[1000000];
- int find_set(int v){
- if (v == p[v])
- return v;
- return p[v] = find_set(p[v]); // сжатие пути
- }
- void union_sets(int a, int b, int c){
- a = find_set(a);
- b = find_set(b);
- if (a != b){
- p[b] = a;
- w[a] += w[b];
- }
- w[a] += c;
- }
- void make_set(int v){
- p[v] = v;
- }
- int main() {
- int n, m;
- cin >> n >> m;
- for (int i = 0; i < n; i++){
- make_set(i);
- }
- for (int i = 0; i < m; i++){
- int a;
- cin >> a;
- if (a == 2){
- int x;
- cin >> x;
- x--;
- cout << w[find_set(x)] << endl;
- } else {
- int x, y, z;
- cin >> x >> y >> z;
- x--; y--;
- union_sets(x, y, z);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment