Cod sursa(job #629563)

Utilizator gabriel93Robu Gabriel gabriel93 Data 3 noiembrie 2011 15:17:40
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<fstream>
using namespace std;

struct nod
{
int vecin,cost;
nod  *adresa;
};

nod* vecini[30001];
int N,M,X,Y;

void adaug(int i, int j, int c)
{
nod *p;
p=new nod; 
p->vecin=j; 
p->cost=c;
p->adresa=vecini[i]; 
vecini[i]=p;

p=new nod; 
p->vecin=i; 
p->cost=c;
p->adresa=vecini[j]; 
vecini[j]=p;
}

int main()
{
int i,ii,jj,cc,viz[30001],dist[30001],nr,pr,ul,c[30001];
//dist[i]=distanta dintre X si i
nod *p;
fstream f1,f2;

f1.open("sate.in",ios::in);
f2.open("sate.out",ios::out);
for (i=0;i<=30000;i++)
	vecini[i]=0;//acelasi lucru este si vecini[i]=NULL;
f1>>N>>M>>X>>Y;
for (i=0;i<=N;i++)
{
	viz[i]=0;
	dist[i]=20000001;
}//20000001 este un fel de infinit
for (i=1;i<=M;i++)
{
	f1>>ii>>jj>>cc;
	adaug(ii,jj,cc);
}
nr=1;
pr=0;
ul=0;
c[0]=X;
viz[X]=1;
dist[X]=0;
while (nr>0)
{
//primul in coada este c[pr] iar ultimul este c[ul]
//toate din coada sunt active, viz[]==1
//tot ce nu este in coada este inactiv viz[]==0
//in coada sunt nr elemente
ii=c[pr];
for (p=vecini[c[pr]];p!=0;p=p->adresa)
{
	jj=p->vecin;
	cc=p->cost;
	if (ii<jj && dist[ii]+cc<dist[jj])
	{
		dist[jj]=dist[ii]+cc;
		if (viz[jj]==0)
		{
			viz[jj]=1;
			nr++;
			ul++;
			if (ul==N)
				ul=0;
			c[ul]=jj;
		}
	}
	else
	if (ii>jj && dist[ii]-cc<dist[jj])
	{
		dist[jj]=dist[ii]-cc;
		if (viz[jj]==0)
		{
			viz[jj]=1;
			nr++;
			ul++;
			if (ul==N)
				ul=0;
			c[ul]=jj;
		}
	}
}
//scoatem acum din coada pe c[pr] cu 
pr++; 
if (pr==N)
	pr=0;
nr--;
}
f2<<dist[Y];
f1.close();
f2.close();
return 0;
}