Cod sursa(job #856344)

Utilizator cameleonGeorgescu Dan cameleon Data 16 ianuarie 2013 12:30:09
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define Nmax 50005
#define INF 0x3f
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

struct arc{
int v,c;
};
vector<arc> a[Nmax];
int n, d[Nmax];

void citire()
{
    int m,i,x,y,c;
    arc z;
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        z.v=y;z.c=c;
        a[x].push_back(z);
    }

}
void afis()
{
    vector<arc>::iterator it;
    int i;
    for(i=1;i<=n;i++){g<<i<<": ";
        for(it=a[i].begin();it!=a[i].end();it++)
            g<<(*it).v<<" "<<(*it).c<<'\n';
    }
}
void BF()
{
    queue<int> q;
    bool eq[Nmax];
    int x;
    vector<arc>::iterator it;
    memset(d,INF,sizeof(d));
    memset(eq,false,sizeof(eq));
    q.push(1);d[1]=0;
    while(!q.empty())
    {
        x=q.front();q.pop();
        for(it=a[x].begin();it!=a[x].end();++it)
            if(d[(*it).v]>d[x]+(*it).c)
                {
                    d[(*it).v]=d[x]+(*it).c;
                    if(!eq[(*it).v])
                    {
                        q.push((*it).v);
                        eq[(*it).v]=true;
                    }

                }
    }

}
void afisare()
{
    int i;
    for(i=2;i<=n;++i)
    if(d[i]==INF)g<<0<<' ';
    else g<<d[i]<<' ';
}
int main()
{
    citire();
    BF();
    afisare();
    return 0;
}