Cod sursa(job #273964)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 9 martie 2009 11:47:10
Problema Sate Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<stdio.h>
#define infile "sate.in"
#define outfile "sate.out"
#define nmax (30*1001)
#define mmax (2*101*1001)
#define inf ~(1<<31)
struct lista
	{
	int n,p,d; //nodul, pozitia si distanta
	} l[mmax];
struct nod
	{
	int p,d; //pozitia din lista, si distanta minima
	} n[nmax];
char viz[nmax]; //viz[i]=1 daca nodul i se afla in coada
int nrn,nrl; //numarul de noduri, respectiv elemente din lista
int x,y; //cele doua sate intre care trebuie calculata distanta

//adauga arcul (x,y) cu costul c
void add(int m, int x, int y, int c)
	{
	l[m].n=y; l[m].d=c; l[m].p=n[x].p; n[x].p=m;
	}

void citire()
	{
	int i,a,b,c,m;
	scanf("%d %d %d %d\n",&nrn,&m,&x,&y);
	for(i=1;i<=m;i++)
		{ //citim muchiile
		scanf("%d %d %d\n",&a,&b,&c); //[a,b] cu c
		add(++nrl,a,b,c); //(a,b) cu c
		add(++nrl,b,a,c); //(b,a) cu c
		}
	}

void initializare()
	{
	int i;
	for(i=1;i<=nrn;i++)
		n[i].d=inf; //initial distanta este infinit
	}

void bfs(int x)
	{
	int ul,d;
	int c[nmax],p,q,e; //coada
	p=q=e=1; c[1]=x; n[x].d=0; //initializam coada
	while(e) //cat timp avem elemene in coada
		{
		x=c[p%nmax]; //nodul curent
		for(ul=n[x].p;ul;ul=l[ul].p) //trecem pe la toti fii lui x
			{
			if(x<l[ul].n) d=n[x].d+l[ul].d; //cand mergem inainte
			else d=n[x].d-l[ul].d; //cand mergem inapoi

			if(d<n[l[ul].n].d) //daca ajung cu o distanta mai mica
				{
				n[l[ul].n].d=d; //distanta cu care ajungem
				if(!viz[l[ul].n]) //daca nu este deja in coada
					{
					q++; e++; //facem loc in coada
					c[q%nmax]=l[ul].n; //adaugam nodul in coada
					viz[l[ul].n]=1; //marcam ca nodul este in coada
					}
				}
			}
		viz[x]=0; //marcam ca scoatem nodul din coada
		p++; e--; //inaintam in coada
		}
	}

int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

citire();
initializare();
bfs(x); //calculam distanta minima din x
printf("%d",n[y].d); //afisem distanta minima dintre x si y

fclose(stdin);
fclose(stdout);
return 0;
}