Pagini recente » Cod sursa (job #3208824) | Cod sursa (job #2506155) | Cod sursa (job #31316) | Cod sursa (job #1624011) | Cod sursa (job #2338662)
#include <fstream>
#include <algorithm>
#define MAXM 200000
using namespace std;
ifstream fin( "lazy.in" );
ofstream fout( "lazy.out" );
struct Drum
{
int x, y, c1, p;
int c2[35];
};
int t[MAXM+5], h[MAXM+5];
Drum v[MAXM+5];
inline int getf( int k )
{
while( t[k]!=k )
k=t[k];
return k;
}
inline int unionf( int a, int b )
{
int ta=getf(a);
int tb=getf(b);
if( ta!=tb )
{
if( h[ta]==h[tb] )
{
h[ta]++;
t[tb]=ta;
}
else
if( h[ta]<h[tb] )
t[ta]=tb;
else
t[tb]=ta;
return 1;
}
return 0;
}
inline void inmultire( int v[], int a, int b )
{
int p=1;
while( b )
{
int c=b%10, ca=a, q=0, r=0;
while( ca )
{
int x=(v[p+q]+(ca%10)*c+r);
v[p+q]=x%10;
r=x/10;
v[0]=p+q;
q++;
ca/=10;
}
if( r>0 )
{
v[p+q]+=r;
v[0]=p+q;
}
p++;
b/=10;
}
}
inline int compar( int x[], int y[] )
{
if( x[0]<y[0] )
return 1;
else
if( x[0]==y[0] )
{
int i=x[0], ok=1;
while( i>=1 && ok )
{
ok=(x[i]==y[i]);
i--;
}
if( i>=1 && x[i]<y[i] )
return 1;
return 0;
}
return 0;
}
bool cmp( Drum a, Drum b )
{
if( a.c1==b.c1 )
return compar(a.c2,b.c2);
return a.c1<b.c1;
}
int main()
{
int n, m;
fin>>n>>m;
for( int i=1;i<=m;i++ )
{
int k;
fin>>v[i].x>>v[i].y>>v[i].c1>>k;
inmultire(v[i].c2,v[i].c1,k);
v[i].p=i;
}
for( int i=1;i<=n;i++ )
t[i]=h[i]=i;
sort(v+1,v+m+1,cmp);
for( int i=1;i<=m;i++ )
if( unionf(v[i].x,v[i].y) )
fout<<v[i].p<<"\n";
return 0;
}