Cod sursa(job #3142716)

Utilizator xDemonstyMatei Haba Ionut xDemonsty Data 23 iulie 2023 16:34:42
Problema Medie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <queue>
using namespace std;

ifstream in("lacusta.in");
ofstream out("lacusta.out");
long long n, m ;
long long dp [ 260 ] [260 ];
long long mat [ 260 ] [ 260 ] ;

long long distmin = 1e9 ;
queue<pair<int,int>>  q;
long long last [ 260 ][ 260 ] ;
void lee ()
{
    while ( !q.empty())
    {
        int i = q.front().first;
        int j = q.front().second ;
        for ( int k = 1 ; k <= m ; k ++ )
        {

            if ( k != j )
            {
                if ( i == n && k == m )
                {
                    distmin = min ( distmin, dp [ i ] [ j ] + mat [ i ] [ k  ]);

                }


                if ( i + 1 <= n  )
                {
                    if ( dp [ i ][ j ] + mat [ i + 1  ] [ k ] + mat [ i ] [ k ] < dp [ i + 1 ] [ k ] && ( i != n || k != m ) )
                    {
                        last [ i + 1] [ k ] = j ;
                        dp [ i + 1 ] [ k ] = dp [ i ] [ j ] + mat [ i + 1 ] [ k ] + mat [ i ] [ k  ] ;
                        q.push( { i + 1, k }) ;
                    }
                }
            }
        }


        q.pop();
    }
}
int main()
{
    in >> n >> m;

    for( int i = 1; i <= n ; i ++ )
    {
        for ( int j = 1; j <= m ; j ++ )
        {
            dp [ i ][ j ] = 1e9;
            in >> mat [ i ] [ j ] ;
        }
    }

    dp [ 1 ] [ 1 ] = mat [ 1 ][ 1 ] ;
    q.push({1,1});
    lee();



    out << distmin ;
    return 0;
}