Cod sursa(job #704216)

Utilizator xulescuStefu Gabriel xulescu Data 2 martie 2012 16:55:02
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <utility>

using namespace std;

#define INF 32500
#define MAXN 50001

vector<pair<int,int> > graf[MAXN];
vector<pair<int,int> > heap;
int n,m;
int dist[MAXN];
bool viz[MAXN];

bool comp(pair<int,int>a,pair<int,int>b){ return a.second<b.second; }

int main(){
    ifstream f("dijkstra.in");
    f >> n >> m;
    int a,b,c;
    for(int i=0;i<m;i++){
        f>>a>>b>>c;
        graf[a].push_back(make_pair(b,c));
        graf[b].push_back(make_pair(a,c));
        if(a==1) dist[b] = c;
        else if(b==1) dist[a] = c;
        else dist[a] = dist[b] = INF;
    }
    for(int i=2; i<=n;i++) heap.push_back(make_pair(i,dist[i]));
    make_heap(heap.begin(), heap.end(), comp);
    while(heap.size()){
        int cur = heap[0].first;
        vector<pair<int,int> >::iterator it;
        for(it=graf[cur].begin(); it!=graf[cur].end(); it++){
            if(!viz[it->first] && dist[it->first]>dist[cur]+it->second) dist[it->first]=dist[cur]+it->second;
        }
        viz[cur] = true;
        heap.erase(heap.begin());
        make_heap(heap.begin(), heap.end(), comp);
    }
    ofstream g("dijkstra.out");
    for(int i=2;i<=n;i++) g << ((dist[i]!=INF)?dist[i]:0) << " ";
    g.close();
    f.close();
    return 0;
}