Cod sursa(job #2371616)

Utilizator MirunaStefaniaLupascu Miruna-Stefania MirunaStefania Data 6 martie 2019 18:39:36
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
#define N 5005
using namespace std;
ifstream fin("dijkstra2.in");
ofstream fout("dijkstra2.out");

int n,m,p,a[N][N],r;
int st,f;
int v[N];///nivelul fiecarui patrat
int t[N];
int task;
int ct;
bool adev=false;



int inf=200000000;

void read()
{
    int i,j,x,y;

    for(i=1; i<=n; ++i)
        fin>>v[i];///nivelul

    for(i=1; i<=n; ++i)
    {
        fin>>x;
        for(j=1; j<=x; ++j)
        {
            fin>>y;
            if(v[y]>v[i])
                a[i][y]=v[y]/v[i];
            else
                a[i][y]=v[i]/v[y];

        }

    }


    fin.close();
}

void initializare()
{
    int i,j;
    for(i=1; i<=n; ++i)
        for(j=1; j<=n; ++j)
            if(i==j)a[i][j]=0;
            else a[i][j]=inf;
}

void print(int x)
{ct++;
 if(t[x]!=0)
    print(t[x]);

 if(adev=false){fout<<ct;adev=true;}
 fout<<x;

}

void dijkstra(int x)
{
    int i,j,dmin,imin,k,lgmin,o;
    bool s[N]= {0};
    int d[N]= {0};
    s[x]=1;
    t[x]=0;

    for(i=1; i<=n; ++i)
    {d[i]=a[x][i];
     if(d[i]<inf)t[i]=x;
     else t[i]=0;
    }

    for(k=1; k<=n-1; ++k)
    {
        dmin=inf+1;
        for(i=1; i<=n; ++i)
            if(!s[i]&&d[i]<dmin)
            {
                dmin=d[i];
                imin=i;
            }
        s[imin]=1;

        for(i=1; i<=n; ++i)
            if(!s[i]&&d[imin]+a[imin][i]<d[i])
            {
                d[i]=d[imin]+a[imin][i];
                t[i]=imin;
            }

    }
   if(task==1)fout<<d[f];
   else print(f);


}


int main()
{
    int i,j;
    fin>>task>>n>>st>>f;
    initializare();
    read();
    for(i=1; i<=n; ++i)
    {for(j=1;j<=n;++j)
     cout<<a[i][j]<<" ";
     cout<<"\n";
    }

    dijkstra(st);

    return 0;
}