Cod sursa(job #329720)

Utilizator irene_mFMI Irina Iancu irene_m Data 7 iulie 2009 11:56:37
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream.h>
#define MaxN 109
#define MaxM 5000
#define Inf 1000009

long a[MaxN][MaxN],T;
int A[MaxN][MaxN],cmax[MaxN][MaxN],v[MaxN],ns,nf,Cmin=Inf,Cmax,n,m,o[MaxN],O[MaxN],k;

int minim(int a,int b)
{
	if(a<b)
		return a;
	return b;
}

int maxim(int a,int b)
{
	if(a>b)
		return a;
	return b;
}

void poz(int li,int ls)
{
	int i=0,j=-1,c;
	while(li<ls)
	{
		if(v[li]>v[ls])
		{
			O[o[li]]=ls; O[o[ls]]=li;
			c=v[li]; v[li]=v[ls]; v[ls]=c;
			c=o[li]; o[li]=o[ls]; o[ls]=c;
			c=i;
			i=-j;
			j=-c;
		}
		li+=i;
		ls+=j;
	}
	k=li;
}

void quick(int li,int ls)
{
	if(li<ls)
	{
		poz(li,ls);
		quick(li,k-1);
		quick(k+1,ls);
	}
}

void cit()
{
	int i,x,y,z,j,min,max;
	ifstream fin("coach.in");
	fin>>n>>m>>T;
	for(i=1;i<=n;i++)
	{
		fin>>v[i];
		O[i]=o[i]=i;
	}
	quick(1,n);
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(i!=j)
				a[i][j]=Inf;
	for(i=1;i<=m;i++)
	{
		fin>>x>>y>>z;
		a[O[x]][O[y]]=a[O[y]][O[x]]=z;
	}
	fin.close();
}

int start(int s)
{
	int i,j,k,sw=0;
	
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			A[i][j]=a[i][j];
		
	for(k=s;k<=n;k++)
		for(i=s;i<=n;i++)
			for(j=s;j<=n;j++)
			{
				if(A[i][j]>A[i][k]+A[k][j])
					A[i][j]=A[i][k]+A[k][j];
				if(A[i][j]<T)
					sw=1;
				if(A[i][j]==T)
				{
					ns=o[i]; nf=o[j]; Cmin=minim(v[s],v[k]); Cmax=maxim(v[k],v[s]);
				}
			}
	return sw;
}

void sol()
{
	int i;
	for(i=1;i<n;i++)
		if(start(i)!=1) 
			break;
}

void afis()
{
	ofstream fout("coach.out");
	fout<<ns<<" "<<nf<<" "<<Cmin<<" "<<Cmax;
	fout.close();
}

int main()
{
	cit();
	sol();
	afis();
	return 0;
}