Cod sursa(job #431766)

Utilizator nautilusCohal Alexandru nautilus Data 1 aprilie 2010 13:20:33
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream>
#include<vector>

#define dmax 200002
#define inf 32000

using namespace std;

vector<long> a[dmax];
vector<int> c[dmax];

int folosit[dmax],cmin[dmax];
long precedent[dmax];

long n,total;

void prim(long k)
{
 long i;
 int min=inf,varfmin=0;
	
 for (i=0; i<a[k].size(); i++)
	 if (cmin[a[k][i]]>c[k][i] && folosit[a[k][i]]==0)
		 {
		  cmin[a[k][i]]=c[k][i];
		  precedent[a[k][i]]=k;
		 }
 
 for (i=1; i<=n; i++)
	 if (folosit[i]==0 && min>cmin[i])
		 {
		  min=cmin[i];
		  varfmin=i;
		 }

 if (varfmin!=0)
	 {
	  total=total+min;
	  folosit[varfmin]=1;
	  prim(varfmin);
	 }
}

int main()
{
 long m,i,x,y,z;
	
 ifstream fin("apm.in");
 fin>>n>>m;
 for (i=1; i<=m; i++)
	 {
	  fin>>x>>y>>z;
	  a[x].push_back(y);
	  c[x].push_back(z);
	  a[y].push_back(x);
	  c[y].push_back(z);
	 }
	
 for (i=1; i<=n; i++)
	 cmin[i]=inf;
 
 folosit[1]=1;
 prim(1);
 
 ofstream fout("apm.out");
 
 fout<<total<<'\n';
 fout<<n-1<<'\n';
 for (i=1; i<=n; i++)
	 if (precedent[i]!=0)
		 fout<<i<<" "<<precedent[i]<<'\n';
 
 fin.close();
 fout.close();

 return 0;
}