Cod sursa(job #184280)

Utilizator tm_raduToma Radu tm_radu Data 23 aprilie 2008 13:09:15
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <stdio.h>
#define NM 50001
#define INF 10000000
#define lf (nod<<1)
#define rt (lf+1)
#define mij ((st+dr)>>1)

int n, m, a[3*NM];
int i, j, k, pos, d[NM], s[NM];
typedef struct nod {
    int vf, c;
    nod* urm;
} NOD, *PNOD;
PNOD l[NM];
    
void Update(int nod, int st, int dr);
void Add(int i, int j, int k);
void Dijkstra();
void Build(int nod, int st, int dr);

int main()
{
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for ( pos = 1; pos <= m; pos++ )
        scanf("%d %d %d", &i, &j, &k),
        Add(i, j, k);
    Dijkstra();
    for ( i = 2; i <= n; i++ )
        printf("%d ", d[i] == INF ? 0 : d[i]);
    printf("\n");
    
    return 0;
}

void Add(int i, int j, int k)
{
    PNOD q = new NOD;
    q->vf = j;
    q->c = k;
    q->urm = l[i];
    l[i] = q;
}

void Build(int nod, int st, int dr)
{
    if ( st == dr ) 
    {
        a[nod] = st;
        return;
    }
    Build(lf, st, mij);
    Build(rt, mij+1, dr);
    a[nod] = d[a[lf]] < d[a[rt]] ? a[lf] : a[rt];
}
    
void Update(int nod, int st, int dr, int pos)
{
	if ( st == dr )
	{
		a[nod] = s[st] == 1 ? 0 : st;
		return;
	}
	if ( pos <= mij ) Update(lf, st, mij, pos);
	if ( mij < pos ) Update(rt, mij+1, dr, pos);
	a[nod] = d[a[lf]] < d[a[rt]] ? a[lf] : a[rt];
}

void Dijkstra()
{
	for ( pos = 0; pos <= n; pos++ )
		d[pos] = (pos == 1 ? 0 : INF);
	Build(1, 1, n);
    for ( int h = 1; h <= n; h++ )
    {
        k = a[1]; s[k] = 1; 
        for ( PNOD q = l[k]; q; q = q->urm )
            if ( !s[q->vf] && d[q->vf] > d[k] + q->c )
            {
                d[q->vf] = d[k] + q->c;
                Update(1, 1, n, q->vf);
            }
		Update(1, 1, n, k);
    }
}