Pagini recente » Cod sursa (job #2102057) | Cod sursa (job #2101464) | Cod sursa (job #1584989) | Cod sursa (job #672166) | Cod sursa (job #541617)
Cod sursa(job #541617)
#include<cstdio>
#include<fstream>
#define ll long long
using namespace std;
const int maxn = 200005;
ifstream fin ("lazy.in");
int i , j , n , m , dad[maxn] , lev[maxn] , e;
struct muchie {
ll int cost , profit;
int x , y , ind;
} v[maxn];
bool cmp ( const muchie &a , const muchie &b ) {
if ( a.cost == b.cost )
return a.profit > b.profit;
return a.cost < b.cost;
}
int father( int node ) {
int root = node , aux;
for( ; root != dad[root] ; )
root = dad[root];
for( ; node != root ; ) {
aux = node;
node = dad[node];
dad[aux] = root;
}
return root;
}
void unite ( int A , int B ) {
if ( lev[A] > lev[B] )
dad[B] = dad[A];
else
dad[A] = dad[B];
if ( lev[A] == lev[B] )
lev[B]++;
}
int main()
{
freopen("lazy.out","w",stdout);
fin >> n >> m;
for( i = 1 ; i <= m ; ++i )
fin >> v[i].x >> v[i].y >> v[i].cost >> v[i].profit,
v[i].ind = i;
for( i = 1 ; i <= n ; ++i )
dad[i] = i , lev[i] = 1;
sort( v + 1 , v + m + 1 , cmp);
for( i = 1 ; i <= m && e < n - 1; ++i ) {
if ( father(v[i].x) != father(v[i].y) ) {
unite( father(v[i].x) , father(v[i].y) );
printf("%d\n",v[i].ind);
++e;
}
}
return 0;
}