Cod sursa(job #541693)

Utilizator nautilusCohal Alexandru nautilus Data 25 februarie 2011 13:21:42
Problema Lazy Scor 10
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 1 Marime 1.55 kb
#include<fstream>
#include<vector>
#define dmax 200010
#define inf 999999
using namespace std;

int n,m;
vector<int> a[dmax],pozm[dmax];
vector<long long> c1[dmax],c2[dmax];
bool v[dmax];
long long c1min[dmax],c2min[dmax];
int prec[dmax];
int nrm;

ofstream fout("lazy.out");

void citire()
{
 int i,x,y,z,w;
 
 ifstream fin("lazy.in");
 
 fin>>n>>m;
 for (i=1; i<=m; i++)
	 {
	  fin>>x>>y>>z>>w;
	  a[x].push_back(y);
	  a[y].push_back(x);
	  
	  c1[x].push_back(z);
	  c1[y].push_back(z);
	  
	  c2[x].push_back(w);
	  c2[y].push_back(w);
	  
	  pozm[x].push_back(i);
	  pozm[y].push_back(i);
	 }
	
 fin.close();
}


void apm(int k)
{
 int i,elem;
 int min1,min2,poz,precc;
	
 nrm++; v[k] = 1;
 for (i=0; i<(int)a[k].size(); i++)
	 {
	  elem = a[k][i];
	  if (v[elem] == 0 && (c1[k][i] < c1min[elem] || (c1[k][i] == c1min[elem] && c2[k][i] * (1 - c1[k][i]) < c2min[elem])))
		  {
		   c1min[elem] = c1[k][i];
		   c2min[elem] = c2[k][i] * (1 - c1[k][i]);
		   prec[elem] = k;
		  }
	 }
 
 min1 = inf; min2 = inf; poz = 0;
 for (i=2; i<=n; i++)
	 if (v[i] == 0 && (min1 > c1min[i] || (min1 == c1min[i] && min2 > c2min[i])))
		 {
		  min1 = c1min[i];
		  min2 = c2min[i];
		  poz = i;
		  precc = prec[i];
		 }

 for (i=0; i<(int)a[poz].size(); i++)
	 if (a[poz][i] == precc)
		 {
		  fout<<pozm[poz][i]<<'\n';
		  break;
		 }
 
 if (nrm < n-1)
	 apm(poz);
}

int main()
{
 int i;
	
 citire();
 
 for (i=2; i<=n; i++)
	 c1min[i] = c2min[i] = inf;
 
 apm(1);
 
 fout.close();
	
 return 0;
}