Cod sursa(job #893383)

Utilizator Oancea.CatalinOancea Catalin Oancea.Catalin Data 26 februarie 2013 15:23:37
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <iostream>
#include <cstring>
#include <list>
using namespace std;
#define IN "dijkstra.in"
#define OUT "dijkstra.out"
#define INF 10000000
fstream f(IN, ios::in), g(OUT, ios::out);
long long n, m, s, done[50001], cost[50001], prov[50001], cos, i, j, x, y;
list < pair < long long, long long > > graf[50001];
list < pair < long long, long long > >::iterator it;
long long visit_all(long long start)
{
    long long minim=INF, care=0;
    for(it=graf[start].begin(); it!=graf[start].end(); it++)
    {
        if(cost[(*it).first]>cost[start]+(*it).second)
        {
            cost[(*it).first]=cost[start]+(*it).second;
            prov[(*it).first]=start;
        }
    }
    for(i=1; i<=n; i++)
    {
        for(it=graf[i].begin(); it!=graf[i].end(); it++)
        {
            if(cost[(*it).first]<minim && done[(*it).first]==0)
            {
                minim=cost[(*it).first];
                care=(*it).first;
            }
        }
    }
    done[care]=1;
    return care;
}
void DIJ(long long S)
{
    long long X, i;
    X=S;
    done[X]=1;
    cost[X]=0;
    prov[X]=1;
    for(i=1; i<=n; i++)
        X=visit_all(X);
}
int main()
{
    f>>n>>m;
    s=1;
    for(i=1; i<=n; i++)
    {
        cost[i]=INF;
        done[i]=0;
        prov[i]=0;
    }

    for(i=1; i<=m; i++)
    {
        f>>x>>y>>cos;
       // cout<<x<<" "<<y<<" "<<cos<<"\n";
        graf[x].push_back(make_pair(y,cos));
    }
    DIJ(s);
    for(i=2; i<=n; i++)
    {
        if(cost[i]==INF)
            g<<"0 ";
        else
            g<<cost[i]<<" ";
    }
}