Cod sursa(job #1377959)

Utilizator steff970Stefan Georgescu steff970 Data 6 martie 2015 09:38:23
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <climits> // ca sa folosesti INT_MAX

using namespace std;
int n,m,x,viz[100], s[100], p[100],y,mini,a[100][100];// viz -> pentru vizitare; s->costul drumului
                                            // p-> pozitia anterioara nodului
void citire()
{
    ifstream f("dijkstra.in");
    int x,y,c;
    f>>n>>m;
    for(int i=1; i<=m; i++)
    {
        f>>x>>y>>c;
        a[x][y]=c;
    }
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            if(i!=j && a[i][j]==0)
                a[i][j]=INT_MAX/2; // aici pui infinit in matrice unde nu ai legaturi
}
void dir()
{
    viz[x]=1; // ai vizitat nodul sursa. duuuh
    for(int i=1; i<=n; i++)
    {
        s[i]=a[x][i]; // populezi vectorul suma
        if(i!=x && s[i]<INT_MAX/2)p[i]=x; // daca ai legaturi, atunci poti sa mergi acolo, din x
    }
    for(int i=1; i<n; i++)
    {
        mini=INT_MAX;
        for(int j=1; j<=n; j++)
            if(viz[j]==0 && s[j]<mini)// daca nu am trecut pe acolo si am legatura
            {
                mini=s[j];//iau suma minima
                y=j;//retin pozitia unde este drumul cu cel mai mic cost
            }
        viz[y]=1;// ma duc in nodul respectiv
        for(int j=1; j<=n; j++)
            if(viz[j]==0 && s[j]>s[y]+a[y][j])//recalculez drumul mini in toate punctele trecand prin punctul y
            {
                s[j]=s[y]+a[y][j];
                p[j]=y;
            }
    }
}
int main()
{
    citire();
    x=1;
    dir();
    ofstream g("dijkstra.out");
    for(int i=2; i<=n; i++)
        g<<s[i]<<' ';
    return 0;
}