Cod sursa(job #903765)

Utilizator alin_iliciAlin Ilici alin_ilici Data 2 martie 2013 19:40:34
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 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 (dist[i]==min)
        {
            poz=i;
            break;
        }
    return poz;
}

void dijkstra (int start)
{
    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++)
        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);
        cost[a].push_back(c);
    }
    dijkstra(1);
    return 0;
}