Pagini recente » Cod sursa (job #795051) | Cod sursa (job #178888) | Cod sursa (job #3273875) | Cod sursa (job #2306093) | Cod sursa (job #1546016)
#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;
}