Cod sursa(job #2658329)

Utilizator xCata02Catalin Brita xCata02 Data 13 octombrie 2020 18:57:23
Problema Lazy Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define ld long double 
#define endl "\n"
 
const int Nmax = 200000;
const int MODULO = 1e9 + 7;
 
vector < tuple < int, int, ll, ll, int > > muchii;
int tata[Nmax], rg[Nmax];
 
int getDaddy(int nod) {
	if(tata[nod] != nod) {
		nod = tata[nod];
	}
	return nod;
}
 
void unire(int x, int y) {
	if(rg[x] < rg[y]) {
		tata[x] = y;
		return;
	}
	if(rg[x] > rg[y]) {
		tata[y] = x;
		return;
	}
	if(rg[x] == rg[y]) {
		tata[x] = y;
		rg[y]++;
	}
}
		
 
void solve() {
	int n, m;
	cin >> n >> m;
	for(int i = 1; i <= m; i++) {
		int x, y;
		ll c1, c2;
		cin >> x >> y >> c1 >> c2;
		muchii.push_back({x, y, c1, c2, i});
		muchii.push_back({y, x, c1, c2, i});
	}
	sort(muchii.begin(), muchii.end(), [&](tuple < int, int, ll, ll, int > a, tuple < int, int, ll, ll, int > b) {
		if(get<2>(a) == get<2>(b)) {
			return get<3>(a) > get<3>(b);
		}
		return get<2>(a) < get<2>(b);
	});
	
	for(int i = 1; i <= n; i++) {
		rg[i] = 1;
		tata[i] = i;
	}
	
	vector < int > ans;
	
	for(auto it : muchii) {
		int x = getDaddy(get<0>(it));
		int y = getDaddy(get<1>(it));
		
		//cout << x << " " << y << endl;
		
		if(x != y) {
			unire(get<0>(it), get<1>(it));
			ans.push_back(get<4>(it));
		}
	}
	
	for(int i = 0; i <= n - 2; i++) {
		cout << ans[i] << endl;
	}
}
 
void fisier() {
	freopen("lazy.in" , "r", stdin);
	freopen("lazy.out", "w", stdout);
}
 
int main() {
	ios_base::sync_with_stdio(0);
	
	cin .tie(0);
	cout.tie(0);
	
	fisier();
	
	int testCases = 1;
	//cin >> testCases;
	while(testCases--) {
		solve();
	}
}