Pagini recente » Diferente pentru problema/hoata intre reviziile 7 si 41 | Diferente pentru problema/hoata intre reviziile 4 si 41 | Monitorul de evaluare | Cod sursa (job #1517406) | Cod sursa (job #1518500)
#include <cstdio>
#include <vector>
#define NMAX 200023
#define LIM 100000003
#define DIM 10000
int n,m;
using namespace std;
char buff[DIM];
int poz=0;
void citeste(int &numar)
{
numar = 0;
char semn='+';
while (buff[poz] < '0' || buff[poz] > '9')
{
semn = buff[poz];
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
}
while ('0'<=buff[poz] && buff[poz]<='9')
{
numar = numar*10 + buff[poz] - '0';
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
}
if (semn == '-')
numar = -numar;
}
struct str
{
int nod;
int val;
}a[NMAX];
int sol[NMAX],tt[NMAX],vis[NMAX],unde[NMAX];
int nt=1;
vector<int>adj[NMAX],cst[NMAX];
int stanga(int x)
{
return 2*x;
}
int dreapta(int x)
{
return 2*x+1;
}
int tata(int x)
{
return x>>1;
}
void checkup(int pos)
{
while(1)
{
int t=tata(pos);
if(t==0) return;
if(a[t].val>a[pos].val)
{
swap(a[t].nod,a[pos].nod);
swap(a[t].val,a[pos].val);
swap(unde[a[t].nod],unde[a[pos].nod]);
pos=t;
}
else return;
}
}
void checkdown(int pos)
{
while(1)
{
int mini=a[pos].val,caz=0;
int s=stanga(pos);
if(s<=nt&&mini>a[s].val)
{
mini=a[s].val;
caz=1;
}
int dr=dreapta(pos);
if(dr<=nt&&mini>a[dr].val)
{
mini=a[dr].val;
caz=2;
}
if(caz==0) break;
else if(caz==1)
{
swap(a[s].nod,a[pos].nod);
swap(a[s].val,a[pos].val);
swap(unde[a[s].nod],unde[a[pos].nod]);
pos=s;
}
else
{
swap(a[dr].nod,a[pos].nod);
swap(a[dr].val,a[pos].val);
swap(unde[a[dr].nod],unde[a[pos].nod]);
pos=dr;
}
}
}
void rem()
{
swap(a[1].nod,a[nt].nod);
swap(a[1].val,a[nt].val);
swap(unde[a[1].nod],unde[a[nt].nod]);
nt--;
checkdown(1);
}
int main()
{
freopen ("apm.in","r",stdin);
freopen ("apm.out","w",stdout);
citeste(n),citeste(m);
int x1,x2,cttx;
for(int i=1;i<=m;i++)
{
citeste(x1),citeste(x2),citeste(cttx);
adj[x1].push_back(x2);
cst[x1].push_back(cttx);
adj[x2].push_back(x1);
cst[x2].push_back(cttx);
}
sol[1]=0;
a[1].nod=1;
a[1].val=sol[1];
unde[1]=1;
for(int i=2;i<=n;i++)
{
++nt;
sol[i]=LIM;
a[i].nod=i;
a[i].val=sol[i];
unde[i]=nt;
}
vector<int>::iterator it1,it2;
for(int i=1;i<=n;i++)
{
int best=a[1].nod;
vis[best]=1;
rem();
for(it1=adj[best].begin(),it2=cst[best].begin();it1!=adj[best].end();++it1,++it2)
{
if(sol[*it1]>*it2&&vis[*it1]==0)
{
sol[*it1]=*it2;
a[unde[*it1]].val=*it2;
checkup(unde[*it1]);
tt[*it1]=best;
}
}
}
int sum=0;
for(int i=1;i<=n;i++) sum+=sol[i];
printf("%d\n%d\n",sum,n-1);
for(int i=2;i<=n;i++) printf("%d %d\n",i,tt[i]);
}