Cod sursa(job #2505437)

Utilizator dorufDoru Floare doruf Data 6 decembrie 2019 20:50:06
Problema Lazy Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("lazy.in");
ofstream fout("lazy.out");

using llong = int64_t;
const int MaxN = 2 * 1e5 + 5;

struct path
{
	int a, b, index;
	llong e, c;

	bool operator < (const path& p) const
	{
		return (e != p.e ? e < p.e : c > p.c);
	}
};

int Find(int x);
void Union(int x, int y);
void Setup();

int t[MaxN];
path p[MaxN];
int n, m;

int main()
{
	ios_base::sync_with_stdio(false);

	fin.tie(0);
	fout.tie(0);

	Setup();

	fin >> n >> m;

	for (int i = 1; i <= m; ++i)
	{
		fin >> p[i].a >> p[i].b >> p[i].e >> p[i].c;
		p[i].index = i;
	}

	sort(p + 1, p + m + 1);

	int counter = 0;

	for (int i = 1; i <= m && counter < n - 1; ++i)
	{
		if (Find(p[i].a) != Find(p[i].b))
		{
			Union(p[i].a, p[i].b);
			fout << p[i].index << '\n';
			++counter;
		}
	}

	fin.close();
	fout.close();
}

int Find(int x)
{
	if (x == t[x])
	{
		return x;
	}

	return t[x] = Find(t[x]);
}

void Union(int x, int y)
{
	int r1 = Find(x);
	int r2 = Find(y);

	if (r1 != r2)
	{
		t[r1] = r2;
	}
}

void Setup()
{
	for (int i = 1; i <= n; ++i)
	{
		t[i] = i;
	}
}