Cod sursa(job #1155433)

Utilizator sergiunascaSergiu Nasca sergiunasca Data 26 martie 2014 21:46:18
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <stdio.h>
#include <queue>
#include <vector>
#include <algorithm>
#define NMax 50002
#define INF 1<<30
using namespace std;
int n,m,i,nod1,nod2,cost,d[NMax];
std::vector<int> viz;

class Compare
{
    public:
    bool operator()(std::pair<int,int> t1, std::pair<int,int> t2)
    {
       if( t1.second > t2.second ) return true;
       return false;
    }
};
std::priority_queue< std::pair<int,int> , std::vector< std::pair<int,int> > , Compare > coada;

struct graf
{
    int nod,cost;
    graf *next;
};
graf *a[NMax];

void add(int where,int what,int cost)
{
    graf *newid = new graf;
    newid->nod = what;
    newid->cost = cost;
    newid->next = a[where];
    a[where] = newid;
}

void dijkstra(int x0)
{
    for(i=2;i<=n;++i)d[i]=INF;
    coada.push(std::make_pair(x0,0));
    int pmin = 0,minim = INF;
    for(int j=1;j<=n;++j)
    {
        minim = INF;
        for(i=1;i<=n;++i)
        {
            if(!viz[i-1] && minim>d[i])
            {
                minim = d[i];
                pmin = i;
            }
        }
        /*do
        {
            std::pair<int,int> foo;
            foo = coada.top();
            pmin = foo.first;
            if(viz[pmin-1]==1)coada.pop();
        }while(!(viz[pmin-1]==0||coada.size()==0));
        if(coada.size()==0)break;
        coada.pop();*/
        viz[pmin-1] = 1;
        graf *t = a[pmin];
        while(t)
        {
            if(d[t->nod] > d[pmin] + t->cost)
            {
                d[t->nod] = d[pmin] + t->cost ;
                coada.push(std::make_pair(t->nod,d[t->nod]));
            }
            t = t->next;
        }
    }
    for(i=2;i<=n;++i)
    {
        if(d[i]==INF)printf("0 ");
        else printf("%d ",d[i]);
    }
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d %d",&n,&m);
    viz.resize(n);
    for(i=1;i<=m;++i)
    {
        scanf("%d %d %d",&nod1,&nod2,&cost);
        add(nod1,nod2,cost);
    }
    dijkstra(1);
    return 0;
}