Pagini recente » Cod sursa (job #1163514) | Cod sursa (job #2220267) | Cod sursa (job #1433589) | Cod sursa (job #2811225) | Cod sursa (job #541626)
Cod sursa(job #541626)
#include<cstdio>
#include<algorithm>
using namespace std;
struct muchie{
int a,b;
long long v,p;
}muc[200100];
int prf[2][100],A[100],B[100];
inline long long modul(int x){
if(x<0)
return -x;
return x;
}
void profit(int poz,int x){
int i,j,t,ax;
for(i=prf[x][0];i>=0;--i)
prf[x][i]=0;
for(i=0;i<50;++i)
A[i]=B[i]=0;
for(ax=modul(muc[poz].p);ax;ax/=10)
A[++A[0]]=ax%10;
for(ax=modul(muc[poz].v);ax;ax/=10)
B[++B[0]]=ax%10;
for(i=1;i<=A[0];++i){
for(t=0,j=1;j<=B[0] || t;++j, t/=10)
prf[x][i+j-1]=(t=prf[x][i+j-1]+A[i]*B[j])%10;
if(i+j-2>prf[x][0])
prf[x][0]=i+j-2;
}
for(i=1,t=0;i<=prf[x][0];++i)
prf[x][i]+=(t=(prf[x][i]-=((i<=A[0])?A[i]:0)+t)<0)*10;
for(;prf[x][0]>1 && !prf[x][prf[x][0]];--prf[x][0])
;
if(muc[poz].p<0)
prf[x][45]=1;
if(muc[poz].p>0)
prf[x][45]=-1;
if(prf[x][0]==1 && !prf[x][1])
prf[x][45]=0;
}
int comp(){
if(prf[0][45]<prf[1][45])
return -1;
if(prf[0][45]>prf[1][45])
return 1;
if(prf[0][45]==1){
if(prf[0][0]>prf[1][0])
return 1;
if(prf[0][0]<prf[1][0])
return -1;
}
if(prf[0][45]==-1){
if(prf[0][0]>prf[1][0])
return -1;
if(prf[0][0]<prf[1][0])
return 1;
}
if(prf[0][45]==1){
for(int i=prf[0][0];i;--i){
if(prf[0][i]>prf[1][i])
return 1;
if(prf[0][i]<prf[1][i])
return -1;
}
}
if(prf[0][45]==-1){
for(int i=prf[0][0];i;--i){
if(prf[0][i]>prf[1][i])
return -1;
if(prf[0][i]<prf[1][i])
return 1;
}
}
return 0;
}
struct cmp{
bool operator() (const int a,const int b){
if(muc[a].v<muc[b].v)
return true;
if(muc[a].v>muc[b].v)
return false;
profit(a,0);
profit(b,1);
if(comp()<0)
return false;
return true;
}
};
int N,M,par[200100],sol[200100],ind[200100];
int tata(int x){
if(par[x]==x)
return x;
return par[x]=tata(par[x]);
}
void solve(){
int i,x,y;
for(i=1;sol[0]<N-1;++i){
x=tata(muc[ind[i]].a);
y=tata(muc[ind[i]].b);
if(x==y)
continue;
par[x]=y;
sol[++sol[0]]=ind[i];
}
}
int main(){
freopen("lazy.in","r",stdin);
freopen("lazy.out","w",stdout);
int i;
scanf("%d%d",&N,&M);
for(i=1;i<=M;++i){
scanf("%d%d%lld%lld",&muc[i].a,&muc[i].b,&muc[i].v,&muc[i].p);
ind[i]=i;
}
for(i=1;i<=N;++i)
par[i]=i;
sort(ind+1,ind+N+1,cmp());
solve();
for(i=1;i<=sol[0];++i)
printf("%d\n",sol[i]);
fclose(stdin);
fclose(stdout);
return 0;
}