Pagini recente » Cod sursa (job #507620) | Cod sursa (job #2678417) | Cod sursa (job #1573186) | Cod sursa (job #2186130) | Cod sursa (job #1709580)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct nod
{
int x;
int y;
int cat;
int per;
}muc[500024];
vector<nod> arb;
int t[250024];
int r[250024];
bool fcomp(nod a, nod b)
{
if(a.cat - b.cat)
{
return a.cat < b.cat;
}
return a.per < b.per;
}
bool fcomp1(nod a, nod b)
{
return a.per > b.per;
}
int n,m,d,p;
int findt(int x)
{
int start = x;
while(x != t[x])
{
x = t[x];
}
while(start != t[start])
{
int startAux =start;
start = t[start];
t[startAux] = x;
}
return x;
}
void unionr(int x, int y)
{
if(r[x] < r[y])
{
t[x] = y;
}
else
{
t[y] = x;
if(r[x] == r[y])
{
r[x]++;
}
}
}
int main()
{
freopen("politie.in","r",stdin);
freopen("politie.out","w",stdout);
scanf("%d%d%d%d", &n, &m, &d, &p);
for(int i = 1; i<=m; ++i)
{
scanf("%d%d%d%d", &muc[i].x, &muc[i].y, &muc[i].cat, &muc[i].per);
}
sort(muc+1, muc+m+1, fcomp);
for(int i = 1; i<=n; ++i)
{
t[i] = i;
r[i] = 0;
}
for(int i = 1; i<=m; ++i)
{
if(findt(muc[i].x) != findt(muc[i].y))
{
unionr(findt(muc[i].x), findt(muc[i].y));
arb.push_back(muc[i]);
}
}
sort(arb.begin(),arb.end(), fcomp1);
for(int i = 0; i<arb.size(); ++i)
{
// printf("%d %d %d %d\n", arb[i].x, arb[i].y, arb[i].cat, arb[i].per);
if(p > 0)
{
if(arb[i].per != arb[i+1].per)
{
printf("%d\n", arb[i].per);
--p;
}
}
}
if(p > 0)
{
printf("%d\n", arb[arb.size()-1].per);
}
fclose(stdin);
fclose(stdout);
return 0;
}