Cod sursa(job #7240)

Utilizator flo_demonBunau Florin flo_demon Data 21 ianuarie 2007 13:13:13
Problema Radiatie Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 2.55 kb
#include <stdio.h>
#include <vector>
#include <map>
#include <queue>
#include <iostream>
#include <algorithm>

#define INF 2000000000

using namespace std;

struct node {
    int nod;
    int dist;
    
    bool operator< (const node& right) const {
         return dist < right.dist;
    }
};

struct startN {
    int nod;
    int ap;   
};

int n, m, k;
int nod1, nod2, cost;
vector<vector<int> > lV;
vector<map<int, int> > a;
vector<int> d;
int SRC;
node sursa, curr;
vector<int>::iterator start, end;
vector<pair<int, int> > queryz;
int rezz[15007];

void Dj();

int main()
{
    FILE *fin = fopen("radiatie.in", "r");
    fscanf(fin, "%d%d%d", &n, &m, &k);
    
    int uu;
    a.resize(n+6);
    d.resize(n+6);
    lV.resize(n+6);
    queryz.resize(k+6);
    for (int i = 1; i <= m; ++i)
    {
        fscanf(fin, "%d%d%d", &nod1, &nod2, &cost);
        a[nod1][nod2] = cost;
        a[nod2][nod1] = cost;
        lV[nod1].push_back(nod2);
        lV[nod2].push_back(nod1);
    }
    for (int i = 1; i <= k; ++i)
    {
        fscanf(fin, "%d%d", &nod1, &nod2);
        if (nod1 > nod2)
            swap(nod1, nod2);
       queryz[i] = make_pair(nod1, nod2);
    }
    fclose(fin);
    
    FILE *fout = fopen("radiatie.out", "w");
    for (int i = 1; i <= k; ++i)
    {
        if (rezz[i] == 0)
        {
            SRC = queryz[i].first;
            Dj();
            for (int j = 1; j <= k; ++j)
            {
                if (rezz[j] == 0 && queryz[j].first == SRC)
                    rezz[j] = d[queryz[j].second];
                if (rezz[j] == 0 && queryz[j].second == SRC)
                    rezz[j] = d[queryz[j].first];
            }
        }
    }
    for (int i = 1; i <= k; ++i)
        fprintf(fout, "%d\n", rezz[i]);
    fclose(fout);
    
    return 0;
}

void Dj()
{
    priority_queue<node> pq;
    sursa.dist = 0;
    sursa.nod = SRC;
    d.assign(n+6, INF);
    d[sursa.nod] = 0;
    node aux;
    pq.push(sursa);
    
    while (!pq.empty())
    {
        curr = pq.top();
        start = lV[curr.nod].begin();
        end = lV[curr.nod].end();
        pq.pop();
        for (; start != end; ++start)
            if (d[(*start)] > curr.dist)
            {
                if (a[curr.nod][(*start)] <= curr.dist)
                    d[(*start)] = curr.dist;
                else
                    d[(*start)] = a[curr.nod][(*start)];
                aux.nod = (*start);
                aux.dist = d[(*start)];
                pq.push(aux);
            }
    }
}