Pagini recente » Cod sursa (job #2475905) | Cod sursa (job #793275) | Cod sursa (job #399975) | Cod sursa (job #2559237) | Cod sursa (job #546373)
Cod sursa(job #546373)
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxN 200005
#define i64 long long
FILE*f=fopen("lazy.in","r");
FILE*g=fopen("lazy.out","w");
int N,M,i,T[maxN],k;
i64 Rez;
struct mch{
int x;
int y;
int pozinit;
i64 C1;
i64 C2;
}A[maxN];
int cmp(mch a,mch b){
if ( a.C1 != b.C1 )
return a.C1 < b.C1;
return a.C2 > b.C2;
}
int root(int nod){
int nod2 = nod;
while ( T[nod] > 0 ){
nod = T[nod];
}
while ( T[nod2] > 0 ){
T[nod2] = nod;
nod2 = T[nod2];
}
return nod;
}
void reun( int nod1 , int nod2 ){
int ra = root(nod1);
int rb = root(nod2);
if ( T[ra] < T[rb] ){
T[ra] -= T[rb];
T[rb] = ra;
}
else{
T[rb] -= T[ra];
T[ra] = rb;
}
}
int main () {
fscanf(f,"%d %d",&N,&M);
for ( i = 1 ; i <= M ; ++i ){
fscanf(f,"%d %d %lld %lld",&A[i].x,&A[i].y,&A[i].C1,&A[i].C2);
A[i].pozinit = i;
}
sort(A+1,A+M+1,cmp);
for ( i = 1 ; i <= N ; ++i ){
T[i] = -1;
}
for ( i = 1 ; i <= M && k < N - 1 ; ++i ){
if ( root( A[i].x ) != root( A[i].y ) ){
++k;
reun( A[i].x , A[i].y );
fprintf(g,"%d\n",A[i].pozinit);
}
}
fclose(f);
fclose(g);
return 0;
}