Pagini recente » Cod sursa (job #1846594) | Cod sursa (job #1937825) | Cod sursa (job #139117) | Cod sursa (job #3252834) | Cod sursa (job #2370393)
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 105
#define inf NMAX*NMAX*1005
using namespace std;
ifstream in ("apm.in");
ofstream out ("apm.out");
struct costuri{
int cost,muchie;
};
struct prim{
int m1,m2,cost;
/*bool operator < (const prim &other) const{
return cost>other.cost;
}*/
};
class cmp{
public:
bool operator () (const prim &a, const prim &b) const{
return a.cost>b.cost;
}
};
int n,m,tata[NMAX],l,c,s;
bool vizitat[NMAX];
vector <costuri> muchii[NMAX];
priority_queue <prim, vector <prim>, cmp> heap;
void transfer(int x)
{
costuri nod_curent;
prim aux;
for(auto i=muchii[x].begin();i!=muchii[x].end();i++){
nod_curent=*i;
aux.m1=x;
aux.m2=nod_curent.muchie;
aux.cost=nod_curent.cost;
heap.push(aux);
}
}
int main()
{
bool okay;
costuri nod_curent;
prim aux;
int i,k,x,y,c;
in>>n>>m;
for(i=1;i<=m;i++){
in>>x>>y>>c;
nod_curent.cost=c;
nod_curent.muchie=y;
muchii[x].push_back(nod_curent);
nod_curent.muchie=x;
muchii[y].push_back(nod_curent);
}
vizitat[1]=1;
tata[1]=0;
transfer(1);
for(k=1;k<=n-1;k++){
okay=true;
while(!heap.empty() and okay==true){
aux=heap.top();
heap.pop();
if(vizitat[aux.m1]+vizitat[aux.m2]==1){
okay=false;
s+=aux.cost;
if(vizitat[aux.m1]==1){
vizitat[aux.m2]=1;
tata[aux.m2]=aux.m1;
transfer(aux.m2);
}
else{
vizitat[aux.m1]=1;
tata[aux.m1]=aux.m2;
transfer(aux.m1);
}
}
}
}
out<<s<<'\n'<<n-1<<'\n';
for(i=1;i<=n;i++){
if(tata[i]!=0)
out<<tata[i]<<' '<<i<<'\n';
}
return 0;
}