Cod sursa(job #1415193)

Utilizator mihaim1980Test Test mihaim1980 Data 3 aprilie 2015 21:38:34
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <iostream>
#include <fstream>
#include <climits>
#include <algorithm>
using namespace std;
int a[101][101],n,vf,v[101],nmin;

    int d[101][101];
int Pivot(int f)
{
   int pivot=0;
   nmin=INT_MAX;
        for(int j=1;j<=n;j++)
            if((v[j]==0) && (d[f][j]<nmin))
            {
                nmin=d[f][j];
                pivot=j;
            }
            v[pivot]=d[f][0]; //modificat
    return pivot;
}
int main()
{
    ifstream in("dijkstra.in");
    ofstream out("dijkstra.out");
    in >> n >> vf;
    fill(&a[0][0],&a[n][n]+1,0);
    for(register int i=1;i<=n;i++)
        for(register int j=1;j<=n;j++ )
            if(i!=j) a[i][j]=INT_MAX;
            else a[i][j]=0;
    int x,y,z;
    while(in>>x>>y>>z) a[x][y]=z;

    d[0][0]=vf;

    //cout << vf << endl;
    fill(v,v+n+1,0);
    v[vf]=vf;
    copy(&a[vf][1],&a[vf][n]+1,&d[0][1]);                        //modificat
   /*for(int i=1;i<=n;i++) cout << a[vf][i] << ' ';
    cout << endl;
    for(int i=1;i<=n;i++) cout << d[0][i] << ' ';*/
   // d[0][vf]=0;
    int i=0,pivot=vf;
    while(pivot)
    {
        pivot=Pivot(i);
        // for(int j=1;j<=n;j++) cout <<  d[i-1][j] << ' ';cout << endl;cout<<pivot << endl;
        i++;
        d[i][0]=pivot;
        for(int j=1;j<=n;j++)
            if(a[d[i][0]][j]!=INT_MAX)
             {
                  if((nmin+a[d[i][0]][j])<d[i-1][j]) d[i][j]=nmin+a[d[i][0]][j];          //modificat
                  else d[i][j]=d[i-1][j];
             } else d[i][j]=d[i-1][j];
         //for(int j=0;j<=n;j++) cout <<  d[i][j] << ' ';cout << endl;
    }
   /* cout << endl;
    for(int j=1;j<=n;j++) cout <<  v[j] << ' ';
    int k;
    cout << endl;
    cin >> k;
    int m[100],g=0;
    while(k!=v[k])
    {
        m[g]=k;k=v[k];g++;
    }
    m[g]=k;
    for(int i=g;i>=0;i--) cout << m[i] << ' ';
        */
    for(int j=1;j<=n;j++)
        if(d[i-1][j]==INT_MAX) out << -1 << ' ';
        else out << d[i-1][j] << ' ';
    return 0;
}