Pagini recente » Cod sursa (job #1786045) | Cod sursa (job #2550755) | Cod sursa (job #190879) | Cod sursa (job #112604) | Cod sursa (job #1917477)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
fstream fin ("lazy.in", ios::in), fout ("lazy.out", ios::out);
const double eps = 1e-10;
class Edge { public : int id; long long c1; double c2; } Muk[200010];
class cmp
{ public :
bool operator () (const Edge &a, const Edge &b)
{
if (a.c1 < b.c1 || (a.c1 == b.c1 && a.c2 - eps > b.c2)) return true;
return false;
}
};
int n, m, T[200010], R[200010];
pair < int, int > M[200010];
vector < int > Sol;
int Find(int node)
{
int aux, boss = node;
while (T[boss] != boss) boss = T[boss];
while (T[node] != node)
{
aux = T[node];
T[node] = boss;
node = aux;
}
return boss;
}
void Unite(int boss1, int boss2)
{
if (R[boss1] < R[boss2])
{
R[boss2] += R[boss1];
T[boss1] = boss2;
}
else
{
R[boss1] += R[boss2];
T[boss2] = boss1;
}
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= m; i ++)
{
long long cc22;
fin >> M[i].first >> M[i].second >> Muk[i].c1 >> cc22;
Muk[i].c2 = log2(Muk[i].c1) + (cc22 < 0 ? -log2(-cc22) : log2(cc22));
Muk[i].id = i;
}
sort(Muk + 1, Muk + 1 + m, cmp());
for (int i = 1; i <= n; i ++)
{
R[i] = 1;
T[i] = i;
}
for (int i = 1; i <= m; i ++)
{
int b1 = Find(M[Muk[i].id].first);
int b2 = Find(M[Muk[i].id].second);
if (b1 != b2)
{
Unite(b1, b2);
fout << Muk[i].id << '\n';
}
}
fout.close();
return 0;
}