Pagini recente » Istoria paginii runda/fmi_bis/clasament | Istoria paginii runda/cosmin_oni2018z2 | Autentificare | sim_oji2012_1 | Cod sursa (job #408053)
Cod sursa(job #408053)
#include<stdio.h>
#include<vector>
#define INF 1000001
#define Nmx 200005
#define pb push_back
#define mp make_pair
using namespace std;
int n,m,Heap[Nmx*70],viz[Nmx],pz[Nmx],apm[Nmx],ns,nr,cost[Nmx];
vector< pair<int,int> > G[Nmx];
struct nod
{
int x,y;
}sol[Nmx];
void citire()
{
scanf("%d%d",&n,&m);
int x,y,c;
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&c);
G[x].pb(mp(y,c));
G[y].pb(mp(x,c));
}
}
void schimb(int x,int y)
{
int aux=Heap[x];
Heap[x]=Heap[y];
Heap[y]=aux;
}
void up_heap(int k)
{
while(k>1)
{
if(cost[Heap[k/2]]<=cost[Heap[k]])
return ;
viz[Heap[k/2]]=k;
viz[Heap[k]]=k/2;
schimb(k,k/2);
k=k/2;
}
}
void downheap(int k)
{
while(k*2<=nr)
{
int p=k*2;
if(p+1<=nr&&cost[Heap[p+1]]<cost[Heap[p]])
++p;
if(cost[Heap[p]]>cost[Heap[k]])
return;
viz[Heap[p]]=k;
viz[Heap[k]]=p;
schimb(p,k);
k=p;
}
}
void taie()
{
viz[Heap[1]]=-1;
schimb(1,nr);
Heap[nr--]=0;
if(nr>0)
{
viz[Heap[1]]=1;
downheap(1);
}
}
void solve()
{
vector< pair<int,int> > ::iterator it;
for(int i=1;i<=n;++i)
cost[i]=viz[i]=INF;
viz[1]=-1;
cost[1]=0;
nr=1;
Heap[1]=1;
int sum=0;
for(int i=1;i<=n;++i)
{
int nod=Heap[1];
sum+=cost[nod];
taie();
int min=INF,pzz=0;
for(it=G[nod].begin();it!=G[nod].end();++it)
{
if(viz[it->first]==-1)
{
if(it->second<min)
{
min=it->second;
pzz=it->first;
}
continue;
}
if( cost[it->first] > it->second )
{
cost[it->first]=it->second;
if( INF == viz[it->first] )
{
Heap[++nr]=it->first;
viz[it->first]=nr;
}
up_heap( viz[it->first] );
}
}
if(i>1)
{sol[++ns].x=nod;
sol[ns].y=pzz;
}
}
printf("%d\n%d\n",sum,ns);
for(int i=1;i<=ns;++i)
printf("%d %d\n",sol[i].x,sol[i].y);
}
int main()
{
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);
citire();
solve();
return 0;
}