Pagini recente » Cod sursa (job #1790725) | Statistici Tomulescu Eduard Gabriel (edw_ard) | Cod sursa (job #127532) | Monitorul de evaluare | Cod sursa (job #543889)
Cod sursa(job #543889)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
struct road
{
int ind, A, B;
long long C1, C2;
};
bool compare(const road& R1, const road& R2)
{
if (R1.C1 != R2.C1)
return R1.C1 < R2.C1;
return R1.C2 > R2.C2;
}
int D[200002], T[200002];
int Find(int nod)
{
if (nod != T[nod]) T[nod] = Find(T[nod]);
return T[nod];
}
void Union(int nod1, int nod2)
{
if (D[nod1] > D[nod2])
T[nod2] = nod1;
else
{
T[nod1] = nod2;
if (D[nod1] == D[nod2]) ++D[nod2];
}
}
int N, M;
vector<road> V;
bool S[200002];
int main()
{
ifstream fin("lazy.in");
ofstream fout("lazy.out");
fin >> N >> M;
for (int i = 1; i <= M; ++i)
{
road R;
fin >> R.A >> R.B >> R.C1 >> R.C2;
R.ind = i;
V.push_back(R);
}
for (int i = 1; i <= N; ++i)
T[i] = i;
sort(V.begin(), V.end(), compare);
for (vector<road>::iterator it = V.begin(); it != V.end(); ++it)
if (Find(it->A) != Find(it->B))
{
Union(Find(it->A), Find(it->B));
S[it->ind] = true;
}
for (int i = 1; i <= N; ++i)
if (S[i]) fout << i << '\n';
fin.close();
fout.close();
}