Cod sursa(job #43848)

Utilizator victorsbVictor Rusu victorsb Data 30 martie 2007 16:26:34
Problema Team Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include <string.h>

#define Nmax 512
#define Pmax 64
#define INF 0x3f3f3f3f

int n, m, p;
int cost[Nmax][Nmax], mat[Nmax][Pmax], home[Pmax], dist[Nmax], g[Nmax];

void citire()
{
    int i, a, b, c;
    
    memset(cost, 0x3f, sizeof(cost));
    
    scanf("%d", &p);
    scanf("%d", &n);
    scanf("%d", &m);
    for (i = 1; i <= m; ++i)
    {
        scanf("%d %d %d", &a, &b, &c);
        cost[a][b] = cost[b][a] = c;
    }
    for (i = 1; i <= p; ++i)
        scanf("%d", &home[i]);
}

void dijkstra(int s)
{
    int i, j, best, ct, nod;

    memset(dist, 0x3f, sizeof(dist));
    dist[s] = 0;
    
    ct = n;
    for (i = 1; i <= n; ++i)
        g[i] = i;
    
    for (i = 1; i <= n; ++i)
    {
        best = 1;
        for (j = 1; j <= ct; ++j)
            if (dist[g[j]] < dist[g[best]])
                best = j;
        
        nod = g[best];
        g[best] = g[ct--];
        
        for (j = 1; j <= n; ++j)
            if (dist[nod] + cost[nod][j] < dist[j])
                dist[j] = dist[nod] + cost[nod][j];
    }
}

void solve()
{
    int i, j;
    
    for (i = 1; i <= p; ++i)
    {
        dijkstra(home[i]);
        for (j = 1; j <= n; ++j)
            mat[j][i] = dist[j];
    }
}

int main()
{
    freopen("team.in", "r", stdin);
    freopen("team.out", "w", stdout);
    citire();
    solve();
    return 0;
}