Cod sursa(job #2039943)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 15 octombrie 2017 10:51:31
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include<bits/stdc++.h>
#define Inf 10000
using namespace std;
int n,circuit=0,viz[100]={0},a[20][20],a2[20][20];
void citire(int a[][100],int &n)
 {  int m,i,j;
     ifstream fin("dijkstra.in");
     fin>>n>>m;
     for( i=1;i<=n;i++)
        for( j=1;j<=n;j++)
        if(i==j) a[i][j]=0;
        else a[i][j]=Inf;

     for(i=1;i<=m;i++)
     {int x,y,z;
         fin>>x>>y>>z;
         a[x][y]=z;
     }

}
void afisare(int a[][100],int n)
{
    int i,j;
    for(i=1;i<=n;i++)
    {for(j=1;j<=n;j++)
        cout<<a[i][j]<<" ";
        cout<<endl;
    }
}
void royfloyd(int a[][100],int n)
{
    int i,j,k;
    for(k=1;k<=n;k++)
        {for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
          if(a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];
          //pred[k]=i,pred[j]=k;
         // afisare(a,n);
         // cout<<endl;
        }

}

void dijkstra(int a[][100],int n,int x,int pred[],int d[])
{
    int i,j,k,viz[100]={0},aa,y;
    for(i=1;i<=n;i++)
    {
        d[i]=a[x][i];
        pred[i]=x;
    }
    pred[x]=0;
    viz[x]=1;

    for(i=1;i<=n-1;i++)
    {
        aa=Inf;
        for(j=1;j<=n;j++) if(d[j]<aa && !viz[j])
        {
            aa=d[j];
            y=j;
        }
        if(aa!=Inf)
        {
            viz[y]=1;
        for(j=1;j<=n;j++)
            if(!viz[j] && d[j]>d[y]+a[y][j])
        {  d[j]=d[y]+a[y][j];
        pred[j]=y;

        }
        }

    }

}

void Afisare(int pred[100],int y)
{
    int i,j,k;
    while(y)
    {
        cout<<y;
        y=pred[y];
    }

}

void Afisare_r(int pred[],int y)
{
    if(y) {Afisare_r(pred,pred[y]);
    cout<<y;}
}

int main()
{   int a[100][100],i,j,n,pred[100],d[100],y;
    citire(a,n);
    //royfloyd(a,n);
   // afisare(a);
//cout<<sizeof(long long);
//t:sa se afiseze costul minim pentru drumul dintre 2 noduri x si y si drumul .
dijkstra(a,n,1,pred,d);
ofstream g("dijkstra.out");
for(i=2;i<=n;i++) g<<d[i]<<' ';

//for(i=1;i<=n;i++) cout<<d[i]<<" ";
//cin>>y;
//Afisare(pred,y);
//cin>>y;
//Afisare_r(pred,y);
//t:sa se afiseze drumul minim dintre nodul x si oricare alt nod din graf, folosind dijkstra
//t:bile si auto

}