Pagini recente » Cod sursa (job #2949052) | Cod sursa (job #428910) | Cod sursa (job #2028245) | Cod sursa (job #1903730) | Cod sursa (job #3194612)
#include <fstream>
#include <queue>
#include <algorithm>
using namespace std;
ifstream fin ("timbre.in");
ofstream fout("timbre.out");
long long n,m,k,x,stare,y,c,sol,i,j,l,nr,cost,T[1000004],S[1000004];
priority_queue <pair<int,int>> Q;
int get_root(int x)
{
int c=x;
while(T[x]!=x)
x=T[x];
int nod=c;
while(nod!=x)
{
c=T[nod];
T[nod]=x;
nod=c;
}
return x;
}
void join(int x,int y)
{
int root_a=get_root(x);
int root_b=get_root(y);
if(root_a<root_b)
swap(root_a,root_b);
T[root_b]=root_a;
}
int main()
{
fin>>n>>m>>k;
for(i=1;i<=n+2;i++)
T[i]=i;
for(i=1;i<=n;i++)
{
fin>>y>>cost;
Q.push({cost,y});
}
l=m/k+1;
i=m;
while(i>=0)
{
if((m-i)%k==0&&m!=i)
l--;
S[i]=l;
i--;
}
while(nr<m/k+1&&!Q.empty())
{
x=Q.top().first;
stare=S[Q.top().second];
Q.pop();
j=get_root(stare);
if(j<=m/k+1)
{
sol+=x;
nr++;
fout<<x<<" "<<j<<"\n";
join(j,j+1);
}
}
fout<<sol;
return 0;
}