Cod sursa(job #675499)

Utilizator lucian666Vasilut Lucian lucian666 Data 7 februarie 2012 17:47:55
Problema Ubuntzei Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<fstream>
#define INF 0x3f3f3f
using namespace std;
ofstream out("ubuntzei.out");
int a[2001][2001],uz[2001],T[2001],d[2001],n,m,k,ubu[2001],rez;
int dijkstra(int start);
void drum(int x);
void citire();
int main()
{
	citire();
	dijkstra(1);
	drum(n);
	out<<rez;
	return 0;
}
void citire()
{
	ifstream in("ubuntzei.in");
	in>>n>>m;
	in>>k;
	for(int kk=1;kk<=k;kk++)
		in>>ubu[kk];
	int i,j,c;
	for(;m;m--)
	{
		in>>i>>j>>c;
		a[i][j]=a[j][i]=c;
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i!=j&&a[i][j]==0)
				a[i][j]=a[j][i]=INF;
}
void drum(int x)
{
	++rez;
	if(x)
	{
		drum(T[x]);
	}
}
int dijkstra(int start)
{
	int i,j,k,poz;
	for(i=1;i<=n;i++)
	{
		T[i]=start;
		d[i]=a[start][i];
		uz[i]=0;
	}
	uz[start]=1;
	T[start]=0;
	for(i=1;i<n;i++)
	{
		int minim=INF;
			for(j=1;j<=n;j++)
				if(d[j]<minim&&uz[j]==0)
				{
					minim=d[j];
					poz=j;
				}
				uz[poz]=1;
				for(k=1;k<=n;k++)
					if(d[k]>d[poz]+a[poz][k]&&uz[k]==0)
					{
						d[k]=d[poz]+a[poz][k];
						T[k]=poz;
					}
	}
	return 1;
}