Pagini recente » Cod sursa (job #1798997) | Cod sursa (job #1860530) | Cod sursa (job #1570122) | Cod sursa (job #2723835) | Cod sursa (job #544244)
Cod sursa(job #544244)
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
#define MAXM 200010
using namespace std;
int N,M;
struct muchie{
int A,B;
long long C1,C2;
double logsum;
int cat;
} V[MAXM];
int P[MAXM];
int W[MAXM];
int finsol[MAXM];
int find_set(int X){
int dad=X;
while (dad!=P[dad])
dad=P[dad];
P[X]=dad;
return dad;
}
void unifica(int X,int Y){
if (W[X]<W[Y]) P[X]=Y; else
if (W[X]>W[Y]) P[Y]=X; else{
P[X]=Y;
++W[Y];
}
}
inline bool cmp(const muchie &A, const muchie &B){
if (A.C1!=B.C1)
return (A.C1<B.C1); else return (A.C2>B.C2);
}
int main(){
freopen("lazy.in","r",stdin);
freopen("lazy.out","w",stdout);
int N,M;
scanf("%d%d",&N,&M);
for (int i=1;i<=M;++i){
scanf("%d%d%lld%lld",&V[i].A,&V[i].B,&V[i].C1,&V[i].C2);
V[i].logsum=log10(V[i].C1)+log10(V[i].C2);
V[i].cat=i;
}
sort(V+1,V+M+1,cmp);
for (int i=1;i<=N;++i) { P[i]=i; W[i]=0; }
memset(finsol,0,sizeof(finsol));
for (int i=1;i<=M;++i){
int X=find_set(V[i].A);
int Y=find_set(V[i].B);
if (X!=Y){
unifica(X,Y);
finsol[V[i].cat]=1;
}
}
for (int i=1;i<=M;++i)
if (finsol[i])
printf("%d\n",i);
fclose(stdin);
fclose(stdout);
return 0;
}