Cod sursa(job #894330)

Utilizator robertgbrrobertgbr robertgbr Data 26 februarie 2013 20:44:05
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#define nlength 50010

using namespace std;
int n,m;
vector< pair <int,int> > mylist[nlength];
bool vizitat[nlength];
int cost[nlength];


typedef pair<int, int> P;
priority_queue< P, vector<P>, greater<P> > myheap;    //heap extract min
//priority_queue <P ,vector<P> > myheap;               //heap extract max

bool extrage_min(int &x,int &y)
{
    if(myheap.empty())
    {
        return 0;
    }
    pair <int,int> a=myheap.top();
    myheap.pop();
    if(vizitat[a.second])
    {
        extrage_min(x,y);
    }
    else
    {
        x=a.first;
        y=a.second;
        vizitat[a.second]=1;
        return 0;
    }
}

int resolve(int s)
{
    vector< pair< int,int > >::iterator it;
    pair <int,int> a;
    for(it=mylist[s].begin();it!=mylist[s].end();it++)
    {
        a=*it;
        if(!vizitat[a.second])
        {
            a.first+=cost[s];
            myheap.push(a);
        }
    }
    extrage_min(a.first,a.second);
    if(myheap.empty() )
    {
        return 0;
    }
    cost[a.second]=a.first; //cost->first
    return resolve(a.second); // nod->second
}

int main()
{
    FILE *inFile;
    FILE *outFile;
    inFile =fopen("dijkstra.in","r");
    outFile=fopen("dijkstra.out","w");
    fscanf(inFile,"%d %d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        fscanf(inFile,"%d %d %d",&a,&b,&c);
        mylist[a].push_back( make_pair(c,b) );       // retinem pe p.first costul si pe p.second nodul spre care se duce
        mylist[b].push_back( make_pair(c,a) );       // pt ca e nevoie cand se fac comparatiile in priority_queue de cost sa fie primul
    }
    cost[1]=0;
    vizitat[1]=1;
    resolve(1);
    /*for(int i=1;i<=n;i++)
    {
        printf("%d %d\n",i,retine[i]);
    }*/
    for(int i=2;i<=n;i++)
    {
        fprintf(outFile,"%d ",cost[i]);
    }   fprintf(outFile,"\n");

    fclose(inFile);
    fclose(outFile);
    return 0;
}