Pagini recente » Cod sursa (job #638314) | Cod sursa (job #3183693) | Cod sursa (job #311959) | Cod sursa (job #1181534) | Cod sursa (job #273964)
Cod sursa(job #273964)
#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;
}