Cod sursa(job #1111042)

Utilizator BiancadarBianca Darolti Biancadar Data 18 februarie 2014 16:39:06
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <queue>
#include <stdio.h>
#include <vector>
#include <limits.h>

using namespace std;

struct nod{
        int inf;
        int cost;
        nod *next;}*aux,*p,*prim[100000];

int d[100000],t[100000],n,m,viz[100000],sol[100000],l=0,s,f;
FILE *fin=fopen("djikstra.in","r");

struct comp
{
        bool operator()(pair<int,int> n1,pair<int,int> n2)
    {

      return(n1.second>n2.second);

    }
};

priority_queue<pair<int,int>,vector<pair<int,int> >,comp> q;

void read()
{
    fscanf(fin,"%d %d",&n,&m);
    int i,x,y,c;
    for(i=1;i<=m;i++)
    {
        fscanf(fin,"%d %d %d",&x,&y,&c);
        aux=new nod;
        aux->inf=y;
        aux->cost=c;
        aux->next=prim[x];
        prim[x]=aux;
        aux=new nod;
        aux->inf=x;
        aux->cost=c;
        aux->next=prim[y];
        prim[y]=aux;
    }
    fscanf(fin, "%d %d",&s,&f);
}

void init(int start)
{
    int i;
    for(i=1;i<=n;i++)
        t[i]=start;
    t[start]=0;
    for(i=1;i<=n;i++)
        d[i]=INT_MAX/2;
    d[start]=0;
    for(p=prim[start];p;p=p->next)
        d[p->inf]=p->cost;
    viz[start]=1;
    q.push(make_pair(start,d[start]));
    for(p=prim[start];p;p=p->next)
        q.push(make_pair(p->inf,d[p->inf]));
}

void afish(int i)
{
    if(t[i])
     {
        sol[++l]=t[i];
        afish(t[i]);
     }
}

void djikstra(int start)
{
    init(start);
    int nodc,i;
    while(!q.empty())
    {
        nodc=q.top().first;
        q.pop();
        viz[nodc]=1;
        for(p=prim[nodc];p;p=p->next)
            if(!viz[p->inf] && d[p->inf]>d[nodc]+p->cost)
            {
                d[p->inf]=d[nodc]+p->cost;
                t[p->inf]=nodc;
                q.push(make_pair(p->inf,d[p->inf]));
            }
    }
    for(i=2;i<=n;i++)
        cout<<d[i]<<" ";
}


int main()
{
    read();
    djikstra(1);
    return 0;
}