Cod sursă (job #718711)

Utilizator avatar TheShadow Ciprian Meriacre TheShadow IP ascuns
Problemă Zapada (clasele 11 și 12) Compilator cpp-32 | 1.72 kb
Rundă Arhiva de probleme Status evaluat
Dată 11 mai 2023 04:18:07 Scor 0
#include<bits/stdc++.h>
using namespace std;

typedef pair<short, short> iPair;

struct Graph {
	int V, E;
	vector< pair<int, iPair> > edges;

	Graph(int V, int E) {
		this->V = V;
		this->E = E;
	}

	void addEdge(short u, short v, int w) {
		edges.push_back({w, {u, v}});
	}
	
	int kruskalMST();
};

struct DisjointSets {
	int *parent, *rnk;
	int n;

	DisjointSets(int n) {
		this->n = n;
		parent = new int[n+1];
		rnk = new int[n+1];

		for (int i = 0; i <= n; i++){
			rnk[i] = 0;
			parent[i] = i;
		}
	}

	int find(int u) {
		if (u != parent[u])
			parent[u] = find(parent[u]);
		return parent[u];
	}

	void merge(int x, int y) {
		x = find(x), y = find(y);

		if (rnk[x] > rnk[y])
			parent[y] = x;
		else
			parent[x] = y;

		if (rnk[x] == rnk[y])
			rnk[y]++;
	}
};

int Graph::kruskalMST() {
	int mst_wt = 0;

	sort(edges.begin(), edges.end());

	DisjointSets ds(V);

	vector< pair<int, iPair> >::iterator it;
	for (it = edges.begin(); it != edges.end(); it++) {
		short u = it->second.first;
		short v = it->second.second;

		int set_u = ds.find(u);
		int set_v = ds.find(v);

		if (set_u != set_v) {
			mst_wt += it->first;
			ds.merge(set_u, set_v);
		}
	}

	return mst_wt;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(NULL);
	ifstream cin("zapada.in");
//	ofstream cout("zapada.out");
	
	int M, c; 
	short N, x, y, K;
	cin >> N >> M >> K;
	
	Graph g(N, M + K);

	for (int i = 0; i < M; i++) {
		cin >> x >> y >> c;
		x--, y--;
		g.addEdge(x, y, c);
	}
	
	cout << g.kruskalMST() << "\n";
	
	for (short i = 0; i < K; i++) {
		cin >> x >> y >> c;
		x--, y--;
		g.addEdge(x, y, c);
		cout << g.kruskalMST() << "\n";
	}
	
	return 0;
}