Cod sursa(job #359945)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 28 octombrie 2009 22:42:35
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

#define FIN "catun.in"
#define FOUT "catun.out"

#define N 50001
#define INF 100000

int n, m, k, end;
int h[N], p[N], d[N], f[N], r[N];

vector < pair <int, int> > v[N];

void swap(int a, int b, int V[])
{
    int aux;

    aux = V[a];

    V[a] = V[b];

    V[b] = aux;
}

void down_heap(int i, int n)
{
	int j = i;

	if (2 * i <= n && d[h[j]] > d[h[2 * i]])
		j = 2 * i;

    if (2 * i + 1 <= n && d[h[j]] > d[h[2 * i + 1]])
		j = 2 * i + 1;

	if (i != j)
	{
        swap(h[i], h[j], p);
        swap(i, j, h);

		down_heap(j, n);
	}
}

void up_heap(int i, int n)
{
    if (i > 1 && d[h[i]] < d[h[i / 2]])
    {
        swap(h[i], h[i / 2], p);
        swap(i, i / 2, h);

        up_heap(i / 2, n);
    }
}

void solve()
{
    int i, j = 0;

    for (i = 1; i <= n; ++ i)
    {
        d[i] = INF;

        if (f[i])
        {
            h[++ end] = i;

            p[i] = end;

            d[i] = 0;
        }
    }

    while (end)
    {
        j = h[1];

        for (i = 0; i < v[j].size(); ++ i)
            if (d[v[j][i].first] >= d[j] + v[j][i].second && p[v[j][i].first] != INF)
            {
                if (d[j] + v[j][i].second == d[v[j][i].first] && r[v[j][i].first] > j && f[j] && !f[v[j][i].first])
                    r[v[j][i].first] = j;
                else if (f[j] && !f[v[j][i].first])
                    r[v[j][i].first] = j;

                d[v[j][i].first] = d[j] + v[j][i].second;

                if (p[v[j][i].first])
                {
                    up_heap(p[v[j][i].first], end);
                    down_heap(p[v[j][i].first], end);
                }
                else
                {
                    h[++ end] = v[j][i].first;

                    p[v[j][i].first] = end;

                    up_heap(end, end);
                }
            }

        swap(p[j], end, h);

        -- end;

        down_heap(p[j], end);

        p[j] = INF;
    }
}

void read()
{
    int i, a, b, c;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d%d%d", &n, &m, &k);

    for (i = 1; i <= k; ++ i)
    {
        scanf("%d", &a);

        f[a] = 1;
    }

    for (i = 1; i <= m; ++ i)
    {
        scanf("%d%d%d", &a, &b, &c);

        v[a].push_back(make_pair(b, c));
        v[b].push_back(make_pair(a, c));

        scanf("\n");
    }
}

int main()
{
    int i;

    read();

    solve();

    for (i = 1; i <= n; ++ i)
            printf("%d ", r[i]);

    printf("\n");
}