Cod sursa(job #1331034)

Utilizator BaltaretuAndreiBaltaretu Andrei BaltaretuAndrei Data 31 ianuarie 2015 11:40:39
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <utility>
#include <vector>

using namespace std;

ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

vector < pair<int,int> > v[50000];

int n,m,i,x,y,c,di,d[50000],pre[50000],inf=16000;
bool viz[50000];

int minim()
{
    int i,min=inf+1,p=0;
    for(i=2;i<=n;i++)
    if(d[i]<min && viz[i]==false)
    {
        min=d[i];
        p=i;
    }
    return p;
}

void dijkstra()
{
    int nr=1,ok=1,mini;
    while(nr<n && ok==1)
    {
        mini=minim();
        if(d[mini]<inf)
        {
            viz[mini]=true;
            nr++;
            for(i=0;i<v[mini].size();i++)
            if(viz[v[mini][i].first]==0 && d[mini]+v[mini][i].second < d[v[mini][i].first])
            {
                d[v[mini][i].first]=d[mini]+v[mini][i].second;
                pre[v[mini][i].first]=mini;
            }
        }
        else ok=0;
    }
}

int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    d[i]=inf;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>di;
        v[x].push_back(make_pair(y,di));
        v[y].push_back(make_pair(x,di));
        if(x==1)
        {
            d[y]=di;
            pre[y]=1;
        }
        else if(y==1)
        {
            d[x]=di;
            pre[x]=1;
        }
    }
    viz[1]=1;
    d[1]=0;
    pre[1]=0;
    dijkstra();
    for(i=2;i<=n;i++)
    if(d[i]>=inf)
    g<<"0 ";
    else
    g<<d[i]<<" ";
    return 0;
}