Pagini recente » Istoria paginii runda/charlie_charlie_r_u_here/clasament | Monitorul de evaluare | Profil bg16 | Diferente pentru utilizator/sunt_3l3v intre reviziile 18 si 12 | Cod sursa (job #543670)
Cod sursa(job #543670)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
#define maxn 200010
#define LL long long
int N, M;
int Arb[maxn], H[maxn];
struct Muchii {
int x, y, idx;
LL eff, cost;
} much[maxn];
vector<int> sol;
int cmp(Muchii a, Muchii b) {
if(a.eff != b.eff) return a.eff < b.eff;
return a.cost > b.cost;
}
int CC(int nod) {
while(Arb[nod] != nod) {
nod = Arb[nod];
}
return nod;
}
int Unite(int p, int q) {
if(H[p] > H[q]) {
Arb[q] = p;
}
else {
Arb[p] = q;
}
if(H[p] == H[q]) { H[q]++; }
}
int main() {
FILE *f1=fopen("lazy.in", "r"), *f2=fopen("lazy.out", "w");
int i, p, q; LL e, j;
fscanf(f1, "%d %d\n", &N, &M);
for(i=1; i<=M; i++) {
fscanf(f1, "%d %d %lld %lld\n", &p, &q, &e, &j);
much[i].idx = i;
much[i].x = p; much[i].y = q;
much[i].eff = e; much[i].cost = j;
}
for(i=1; i<=N; i++) {
Arb[i] = i, H[i] = 1;
}
sort(much+1, much+M+1, cmp);
for(i=1; i<=M; i++) {
p = CC(much[i].x); q = CC(much[i].y);
if(p != q) {
Unite(p, q);
sol.push_back( much[i].idx );
}
}
for(i=0; i<sol.size(); i++) {
fprintf(f2, "%d\n", sol[i]);
}
fclose(f1); fclose(f2);
return 0;
}