Pagini recente » Cod sursa (job #728832) | Cod sursa (job #1698790) | Cod sursa (job #1377266) | Cod sursa (job #1675555) | Cod sursa (job #2426438)
#include <fstream>
#include <map>
#include <iterator>
using namespace std;
ifstream fin ("dijkstra.in");
ofstream fout ("dijkstra.out");
multimap < int, int > a[50001];
multimap < int, int > :: iterator it, itt, poz;
int n, m, p, x, y, c, i, j, minn;
int P[50001], v[50001];
bool ok, fr[50001];
int main()
{
fin >> n >> m;
p = 1;
for ( i = 1 ; i <= m ; i++ )
{
fin >> x >> y >> c;
a[x].insert ( pair < int, int > ( c, y ) );
a[y].insert ( pair < int, int > ( c, x ) );
if ( x == p ) P[y] = c;
if ( y == p ) P[x] = c;
}
fr[p] = 1;
while ( a[p].empty() == 0 )
{
minn = a[p].begin() -> first;
i = a[p].begin() -> second;
a[p].erase ( a[p].begin() );
P[i] = 0;
fr[i] = 1;
if ( v[i] == 0 ) v[i] = minn;
else if ( minn < v[i] ) v[i] = minn;
while ( a[i].empty() == 0 )
{
it = a[i].begin();
if ( fr[it -> second] == 0 )
{
if ( P[ it -> second ] != 0 )
{
if ( minn + it -> first < P[ it -> second ] )
{
poz = a[p].find ( it -> second );
for ( itt = poz ; itt != a[p].end() ; itt++ )
if ( itt -> second == it -> second )
{
a[p].erase( itt );
a[p].insert ( pair < int, int > ( minn + it -> first, it -> second ) );
P[ it -> second ] = minn + it -> first;
break;
}
}
}
else
{
a[p].insert ( pair < int, int > ( minn + it -> first, it -> second ) );
P[ it -> second ] = minn + it -> first;
}
}
a[i].erase ( it );
}
}
for ( i = 1 ; i <= n ; i++ )
{
if ( v[i] == 0 && i != p ) fout << -1 << ' ';
else fout << v[i] << ' ';
}
return 0;
}