Cod sursa(job #1546016)

Utilizator AndreiGrigorasAndrei Grigoras AndreiGrigoras Data 7 decembrie 2015 16:31:42
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <queue>
#define inf 10000000
using namespace std;

ifstream fin ( "dijkstra.in" ) ;
ofstream fout ( "dijkstra.out" ) ;

int n , node_start , cost[120][120] , vis[120]  , dist[120]  , father[120] ;

void set_cost()
{
    for ( int i = 1 ; i <= n ; i++ )
        for ( int j = i + 1 ; j <= n ; j++ )
            cost[i][j] = cost[j][i] = inf ;
}

void prepare()
{
    for ( int i = 1 ; i <= n ; i++ )
    {
        dist[i] = cost[node_start][i] ;
        father[i] = node_start ;
    }
    vis[node_start] = 1 ;
    father[node_start] = 0 ;
}

void read()
{
    fin >> n >> node_start ;
    set_cost() ;
    while ( !fin.eof() )
    {
        int x , y , z ;
        fin >> x >> y >> z ;
        cost[x][y] = z ;
    }
    prepare() ;
}

void solve()
{
    int dmin , vfmin ;
    for ( int j = 1 ; j <= n ; j++ )
    {
        dmin = inf ;
        for ( int i = 1 ; i <= n ; i++ )
            if ( !vis[i] && dmin > dist[i] )
            {
                dmin = dist[i] ;
                vfmin = i ;
            }
        vis[vfmin] = 1 ;
        for ( 
int i = 1 ; i <= n ; i++ )
            if ( !vis[i] && dist[i] > dmin + cost[vfmin][i] )
            {
                father[i] = vfmin ;
                dist[i] = dmin + cost[vfmin][i] ;
            }
    }
}

void print()
{
    for ( int i = 1 ; i <= n ; i++ )
        if ( dist[i] == inf )
            fout << "-1" << ' ' ;
        else
            fout << dist[i] << ' ' ;
}

int bellman_ford()
{
    int i , j , k  ;
    for ( int i = 1 ; i <= n ; i++ )
        for ( int j = 1 ; j <= n ; j++ )
            for ( int k = 1 ; k <= n ; k++ )
                if ( cost[j][k] != inf && dist[k] > dist[j] + cost[j][k] )
                {
                    dist[k] = dist[j] + cost[j][k] ;
                    father[k] = j ;
                }
    for ( int j = 1 ; j <= n ; j++ )
        for ( int k = 1 ; k <= n ; k++ )
            if ( cost[j][k] != inf && dist[k] > dist[j] + cost[j][k] ) return 0 ;
    return 1 ;
}
int main()
{
    read() ;
    if ( bellman_ford() )
    {
        solve() ;
        print() ;
    }
    return 0;
}