Cod sursa(job #1113525)

Utilizator denis_tdrdenis tdr denis_tdr Data 20 februarie 2014 17:58:22
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <vector>
#define inf 999999
using namespace std;

int n, m;
vector<vector<int> > c;
vector<int> l;
vector<int> tata;
vector<bool> viz;
void citire(){
    ifstream f("dijkstra.in");
    f>>n>>m;
    viz=vector<bool>(n+1, false);
    l=vector<int>(n+1, inf);
    tata=vector<int>(n+1, -1);
    c=vector<vector<int> >(n+1, vector<int>(n+1, inf));
    for(int i=1;i<=n;i++)
        c[i][i]=-1;

    int x,y,z;
    for(int i=0;i<m;i++){
        f>>x>>y>>z;
        c[x][y]=z;
    }
    f.close();
    return;
    for(int i=1;i<=n;i++)
        cout<<"\t"<<i;
    cout<<"\n";
    for(int i=1;i<=n;i++){
        cout<<i<<":\t";
        for(int j=1;j<=n;j++)
            cout<<c[i][j]<<"\t";
        cout<<"\n";
    }

}
void dijkstra(int x0){
    int minim, k, ok;
    for(int i=0;i<=n;i++)
        l[i]=c[x0][i], tata[i]=x0, viz[i]=false;
    tata[x0]=0;
    viz[x0]=true;
    ok=1;
    while(ok){
        minim=inf;
        for(int i=1;i<=n;i++)
            if(!viz[i] && minim>l[i])
                minim=l[i], k=i;
        if(minim != inf){
            viz[k]=true;
            for(int i=1; i<=n; i++)
                if(!viz[i] && l[i]>l[k]+c[k][i]){
                    l[i]=l[k]+c[k][i];
                    tata[i]=k;
                }
        }
        else ok=0;
    }
}
int main()
{
    citire();
    dijkstra(1);
    ofstream g("dijkstra.out");
    for(int i=2;i<=n;i++)
        g<<(l[i]!=inf?l[i]:0)<<" ";
    g.close();
    return 0;
}