Pagini recente » Cod sursa (job #2962354) | Cod sursa (job #1209665) | Cod sursa (job #2878706) | Cod sursa (job #2971415) | Cod sursa (job #2806214)
#include <cstdio>
#include <algorithm>
#define N 250002
#define M 500002
using namespace std;
FILE* f, * g;
struct bla
{
int x, y, c, p;
}v[M];
bool how(bla A, bla B)
{
if (A.c != B.c)
return (A.c < B.c);
return (A.p < B.p);
}
int tata[N], rang[N], sol[N];
int root(int nod)
{
while (nod != tata[nod])
nod = tata[nod];
return nod;
}
void unite(int ma, int mb)
{
if (rang[ma] < rang[mb])
tata[ma] = mb;
else
tata[mb] = ma;
if (rang[ma] == rang[mb])
++rang[ma];
}
int main()
{
f = fopen("politie.in", "r");
g = fopen("politie.out", "w");
int cat, k, n, m, a, b, ma, mb;
fscanf(f, "%d %d %d %d", &n, &m, &cat, &k);
bla val;
for (int i = 1;i <= m;++i)
fscanf(f, "%d %d %d %d", &v[i].x, &v[i].y, &v[i].c, &v[i].p);
for (int i = 1;i <= n;++i)
tata[i] = i;
int nr = 1;
sort(v + 1, v + m + 1, how);
for (int i = 1;i <= m;++i)
{
val = v[i];
a = val.x;
b = val.y;
ma = root(a);
mb = root(b);
if (ma != mb)
{
unite(ma, mb);
sol[++sol[0]] = val.p;
}
}
sort(sol + 1, sol + sol[0] + 1);
for (int i = sol[0];i >= 1;--i)
if (nr > k)
{
break;
}
else
if (sol[i] != sol[i + 1])
{
++nr;
fprintf(g, "%d\n", sol[i]);
}
fclose(f);
fclose(g);
return 0;
}