Pagini recente » Borderou de evaluare (job #268660) | Cod sursa (job #2719545) | Cod sursa (job #1265222)
#include <fstream>
#include <vector>
#define NMAX 200000
#define INF 1001
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int n, m;
struct vecin{
vector<int> v;
vector<int> c;
};
vecin G[NMAX];
int cmin[NMAX], prec[NMAX], Z[NMAX];
int cost_apm;
void init();
void prim(int);
int main(){
init();
prim(1);
return 0;
}
void init(){
fin>>n>>m;
int i, x, y, c;
for(i = 1; i <= m; ++i){
fin>>x>>y>>c;
G[x].v.push_back(y);
G[y].v.push_back(x);
G[x].c.push_back(c);
G[y].c.push_back(c);
}
/*
for(i = 1; i<=n; ++i){
if(G[i].v.size() != G[i].c.size())
fout<<"PUSH_BACK PROBLEM!!!";
}*/
for(i = 1; i<=n; ++i)
cmin[i] = INF;
}
void prim(int vfs){
int i;
for(i = 0; i< G[vfs].c.size(); ++i){
cmin[ G[vfs].v[i] ] = G[vfs].c[i];
prec[ G[vfs].v[i] ] = vfs;
}
int nrv = 1; Z[vfs] = 1;
int cost_minim, vfmin;
while(nrv <= n-1){
cost_minim = INF;
for(i = 1; i<= n; ++i){
if(!Z[i] && cmin[i] < cost_minim){
vfmin = i;
cost_minim = cmin[vfmin];
}
}
//if(cost_minim == INF) break;
Z[vfmin] = 1; cost_apm += cost_minim; ++nrv;
for( i = 0; i < G[vfmin].v.size(); ++i){
if( cmin[ G[vfmin].v[i] ] > G[ vfmin ].c[i] && !Z[ G[vfmin].v[i] ] ){
cmin[ G[vfmin].v[i] ] = G[ vfmin ].c[i];
prec[ G[vfmin].v[i] ] = vfmin;
}
}
}
fout<<cost_apm<<' '<<n-1<<'\n';
for(i = 1; i<=n; ++i){
if(prec[i]){
fout<<i<<" "<<prec[i]<<"\n";
}
}
}