Pagini recente » Cod sursa (job #3246490) | Cod sursa (job #1606958) | Cod sursa (job #345055) | Cod sursa (job #363602) | Cod sursa (job #1900974)
#include<stdio.h>
#include<algorithm>
#define MAX 500001
#define MBX 250001
using namespace std;
FILE *f1 = fopen("politie.in", "r");
FILE *f2 = fopen("politie.out", "w");
int n, m, d, p, i, j, nr, t1, t2, v[MBX], h[MBX], nrsol;
struct muchii
{
int a, b, pericol, grad;
}muchie[MAX], m2[MAX];
int comp(muchii a, muchii b)
{
if (a.grad < b.grad) return 1;
if (a.grad == b. grad && a.pericol < b.pericol) return 1;
return 0;
}
int padre(int x)
{
int t = x, aux;
while(v[t] != 0)
t = v[t];
while (x != t)
{
aux = v[x];
v[x] = t;
x = aux;
}
return t;
}
void insieme(int x, int y)
{
if (h[x] < h[y])
v[x] = y;
else if (h[x] > h[y])
v[y] = x;
else
{
v[y] = x;
h[x]++;
}
}
int comp2(muchii a, muchii b)
{
if (a.pericol > b.pericol)
return 1;
return 0;
}
int main()
{
fscanf(f1, "%d%d%d%d", &n, &m, &d, &p);
for (i = 1; i <= m; i++)
fscanf(f1, "%d%d%d%d", &muchie[i].a, &muchie[i].b, &muchie[i].grad, &muchie[i].pericol);
sort(muchie + 1, muchie + m + 1, comp);
nr = 1;
for (i = 1; i <= n - 1; i++)
{
t1 = padre(muchie[nr].a);
t2 = padre(muchie[nr].b);
while (t1 == t2)
{
nr++;
t1 = padre(muchie[nr].a);
t2 = padre(muchie[nr].b);
}
nrsol++;
m2[nrsol] = muchie[nr];
insieme(t1, t2);
}
sort(m2 + 1, m2 + nrsol + 1, comp2);
t1 = -1; t2 = 0;
for (i = 1; i <= nrsol; i++)
if (t1 != m2[i].pericol)
{
fprintf(f2, "%d\n", m2[i].pericol);
t2++;
if (t2 == p)
break;
t1 = m2[i].pericol;
}
return 0;
}