Cod sursa(job #954818)

Utilizator sandruSandru Petru-Ionut sandru Data 30 mai 2013 07:01:05
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<iostream>
#include<vector>
#include<fstream>
using namespace std;

#define inf 1000000000
#define maxn 50005
 
vector <int>vec[maxn], cost[maxn];
int dist[maxn], ok[maxn];
int noduri, muchii, nr;
 
int minimul()
{
    int i, min;
    min=inf;
    for (i=1; i<=noduri; i++)
        if ((ok[i]<min)&&((ok[i]!=0)||(nr!=1)))
        {
            min=ok[i];
            nr=1;
        }
    return min;
}
 
int poz_min(int min)
{
    int i,poz;
    for (i=1;i<=noduri;i++)
        if (ok[i]==min)
        {
            poz=i;
            break;
        }
    return poz;
}
 
void dijkstra (int start)
{
    unsigned int i,j,k,min;
    ofstream g("dijkstra.out");
    for (i=1;i<=noduri;i++)
        if (i==start)
        {
            dist[i]=0;
            ok[i]=0;
        }
        else
        {
            dist[i]=inf;
            ok[i]=inf;
        }
    k=0;
    while (k<noduri)
    {
        min=minimul();
        i=poz_min(min);
        ok[i]=0;
        for (j=0;j<vec[i].size();j++)
        {
            if (cost[i][j]+min<dist[vec[i][j]])
            {
                dist[vec[i][j]]=cost[i][j]+min;
                ok[vec[i][j]]=cost[i][j]+min;
            }
        }
        k=k+1;
    }
    for (i=2;i<=noduri;i++)
    {
        if (dist[i]==inf)
            dist[i]=0;
        g<<dist[i]<<" ";
    }
}
 
int main()
{
    int i,a,b,c;
    ifstream f("dijkstra.in");
    f>>noduri>>muchii;
    for (i=1;i<=muchii;i++)
    {
        f>>a>>b>>c;
        vec[a].push_back(b);
        //vec[b].push_back(a);
        cost[a].push_back(c);
        //cost[b].push_back(c);
    }
    dijkstra(1);
    return 0;
}