Pagini recente » Cod sursa (job #1067627) | Cod sursa (job #2782948) | Cod sursa (job #5616) | Cod sursa (job #1629) | Cod sursa (job #407930)
Cod sursa(job #407930)
#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*3],viz[Nmx],pz[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 solve()
{
vector< pair<int,int> > ::iterator it;
for(int i=1;i<=n;++i)
{
cost[i]=INF;
viz[i]=-1;
}
pz[1]=-1;
for(it=G[1].begin();it!=G[1].end();++it)
{
cost[it->first]=it->second;
Heap[++nr]=it->first;
viz[it->first]=nr;
up_heap(nr);
}
int sum=0;
for(int i=2;i<=n;++i)
{
int nod=Heap[1];
pz[nod]=-1;
schimb(1,nr);
viz[Heap[1]]=1;
Heap[nr--]=0;
downheap(1);
sum+=cost[nod];
int min=INF,pzz=0;
for(it=G[nod].begin();it!=G[nod].end();++it)
{
if(pz[it->first]==-1)
{if(it->second<min)
{
min=it->second;
pzz=it->first;
}
}
else if(viz[it->first]==-1)
{
Heap[++nr]=it->first;
cost[it->first]=it->second;
viz[it->first]=nr;
up_heap(nr);
}
else if(it->second<cost[it->first])
{
cost[it->first]=it->second;
up_heap(viz[it->first]);
}
}
sol[++ns].x=pzz;
sol[ns].y=nod;
}
printf("%d\n%d\n",sum,n-1);
for(int i=1;i<=ns;++i)
printf("%d %d\n",sol[i].x,sol[i].y);
}
int main()
{
freopen("prim.in","r",stdin);
freopen("prim.out","w",stdout);
citire();
solve();
return 0;
}