Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 210 si 209 | Cod sursa (job #2126382) | Cod sursa (job #1074973) | Cod sursa (job #467496) | Cod sursa (job #2979032)
/// Algoritmul lui Prim
#include <bits/stdc++.h>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
const int N = 100010;
int n,m,x,y,cst,costArbore;
bitset<N> used;
vector<pair<int,int>> v[N],A;
priority_queue<tuple<int,int,int>> M;
int main()
{
f>>n>>m;
for(int i=1;i<=m;i++)
{
f>>x>>y>>cst;
v[x].push_back(make_pair(y,cst));
v[y].push_back(make_pair(x,cst));
}
used[1]=1;
for(auto it:v[1])
{
tie(x,cst)=it;
M.push(make_tuple(-cst,1,x));
}
while(M.size())
{
tie(cst,x,y)=M.top();
M.pop();
if(used[x]&&used[y])
continue;
if(used[y])swap(x,y);
costArbore-=cst;
A.push_back(make_pair(x,y));
used[y]=1;
for(auto it:v[y])
{
tie(x,cst)=it;
if(!used[x])
M.push(make_tuple(-cst,y,x));
}
}
g<<costArbore<<'\n';
g<<A.size()<<'\n';
for(auto it:A)
{
tie(x,y)=it;
g<<x<<' '<<y<<'\n';
}
return 0;
}
//metoda :
// plecam de la un arbore care contine doar un singur nod ( nodul 1)
// in mod repetat se procedeaza astfel:
// la un moment dat avem un arbore incomplet la care am adaugat niste noduri
// odata cu adaugarea unui nod se adauga muchiile care leaga acel nod
// de alte noduri care !!! NU SUNT INCA ADAUGATE LA ARBORE !!!
// se alege mereu cea mai mica muchie
// care leaga un nod din arbore cu unul care inca nu a fost pus in arbore
// structura de date necesare
// -> pentru muchii o coada de prioritati care imi scoate in top
// cea mai mica muchie disponibila