Cod sursa(job #545155)
#include<fstream>
#include<algorithm>
#define MaxN 200005
using namespace std;
struct muchie{
int x,y,c1,c2,ind;
};
muchie e[MaxN];
int n,m,T[MaxN],rg[MaxN];
struct cmp{
bool operator()(const muchie &a , const muchie &b )
{
if( a.c1 != b.c1 )
return a.c1<b.c1;
else
return a.c2>b.c2;
}
};
int find_root(int x)
{
int y,rad;
rad = x;
while( T[rad] != rad )
rad = T[rad];
while( T[x] != x )
{
y = T[x];
T[x] = rad;
x = y;
}
return rad;
}
void merge(int x , int y)
{
if( rg[x] <= rg[y] )
T[x] = y;
else
T[y] = x;
if( rg[x] == rg[y] )
++rg[y];
}
int main()
{
ifstream f ("lazy.in");
ofstream g ("lazy.out");
f >> n >> m;
int i,nr;
for( i = 1 ; i <= n ; i++ )
T[i] = i , rg[i] = 1;
for( i = 1 ; i <= m ; i++ )
{
f >> e[i].x >> e[i].y >> e[i].c1 >> e[i].c2;
e[i].ind = i;
}
sort(e+1,e+m+1,cmp());
i = 1;
nr = 0;
while( nr < n-1 )
{
int rx,ry;
rx = find_root(e[i].x);
ry = find_root(e[i].y);
if( rx != ry )
{
merge(rx,ry);
nr++;
g << e[i].ind << '\n';
}
i++;
}
return 0;
}