Cod sursa(job #7210)

Utilizator mike_jfa_nemAgica Marius mike_jfa_nem Data 21 ianuarie 2007 13:05:32
Problema Radiatie Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.51 kb
#include <fstream>
#include <iostream>
//#define infinit 2000000000;
//using namespace std;
int n,m,k;
int x[30005],y[30005],xrez[30005],yrez[30005],cost[30005],viz[30005],sol[30005],c[30005];
void citire()
{int i;
 ifstream f("radiatie.in");
 f>>n>>m>>k;
 for (i=1;i<=m;i++)
	 f>>x[i]>>y[i]>>c[i];
 for (i=1 ;i<=k;i++)
	 f>>xrez[i]>>yrez[i];
 f.close();
 for (i=0;i<=n;i++) 
  sol[i]=0;
}

int search(int a, int b)
{for (int i=1;i<=m;i++)
 if ( ((x[i]==a) && (y[i]==b)) || (( x[i]==b ) && (y[i]==a )) ) return c[i];
 return 0;
}
void initializare(int nod)
{int a;
 for (int i=1;i<=n;i++)
	{cost[i]=2000000000;
	 a = search (i,nod);
     if (a) cost[i]=a;
	 viz[i]=0;
    }
 cost[nod]=0; viz[nod]=1;
}

void bagarez(int nod,int t)
{int i;
 for (i=1;i<=k;i++)
  if (xrez[i] == nod ) sol[i] = cost[yrez[i]];

}
void rezolvare()
{long int i,t,a,min=0,p;
 for (t=1;t<=k;t++)
  if (sol [t] == 0 )
  {initializare ( xrez[t] );
   min =0;
   while (min!=2000000000)
   {min = 2000000000;
    for (i=1;i<=n;i++)
		if (( !viz[i] ) && (cost[i] < min ))
		{p=i;
		 min = cost[i];
		}			
    if (min < 2000000000)
	{viz[p] = 1;
	 for (i=1;i<=m;i++)
		if (viz[i] == 0 ) 
		{a= search(i,p);
		  if (a)
		   {if (a < cost [p])
		  cost[i] = cost [p];
		   else cost[i]=a;
		   } 
		}
	}
   }
   bagarez(xrez[t],t);
 //  sol[t]=cost[yrez[t]];
  }
}

int main()
{citire();
 rezolvare();
 ofstream g("radiatie.out");
 for (int i=1;i<=k;i++) g <<sol[i]<<'\n';
 g.close();
 return 0;
}