Cod sursa(job #536180)

Utilizator nahsucpasat cristian nahsuc Data 18 februarie 2011 12:46:14
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<stdio.h>
#include<vector>
#include<fstream>
#include<queue>
using namespace std;
#define maxnod 50001
#define MINIM 1<<30
#define cost first
#define to second
int noduri,muchii,i;
vector< pair<int,int> > matrix[maxnod];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > coada;
// FILE *in,*out;
vector<int> dist(maxnod,MINIM);
void dijkstra(int startNode);
int main()
{
    int nod1,nod2,costul;
    ifstream in("dijkstra.in");
    ofstream out("dijstra.out");
   // in=fopen("dijkstra.in","rt");
   // out=fopen("dijkstra.out","wt");
   // fscanf(in,"%d%d",&noduri,&muchii);
   in>>noduri>>muchii;
    for(i=1;i<=muchii;i++)
    {
        //fscanf(in,"%d %d %d",&nod1,&nod2,&costul);
        in>>nod1>>nod2>>costul;
        matrix[nod1].push_back(make_pair(costul,nod2));
    }

    dijkstra(1);

    for(i=2;i<=noduri;i++)
      //  { dist[i]==MINIM ? fprintf(out,"0 ") : fprintf(out,"%d ",dist[i]); }

        out << (dist[i] == MINIM ? 0 : dist[i]) << " ";
    return 0;
}

void dijkstra(int startNode)
{
    dist[startNode]=0;
    vector<pair<int,int> >::iterator vecin;
    vector<pair <int,int> >::iterator end;
    pair<int,int> nodCurent;
    coada.push(make_pair(0,startNode));
    while(!coada.empty())
    {
        nodCurent=coada.top();
        coada.pop();
        end=matrix[nodCurent.to].end();
        for(vecin=matrix[nodCurent.to].begin();vecin!=end;++vecin)
            if(dist[vecin->to]>dist[nodCurent.to]+vecin->cost)
            {
                dist[vecin->to]=dist[nodCurent.to]+vecin->cost;
                coada.push(make_pair(dist[vecin->to],vecin->to));
            }
    }

}