Pagini recente » Cod sursa (job #1140225) | Cod sursa (job #288708) | Cod sursa (job #2114971) | Cod sursa (job #894455) | Cod sursa (job #279100)
Cod sursa(job #279100)
#include<cstdio>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
#define INPUT "dijkstra.in"
#define OUTPUT "dijkstra.out"
#define lp vector< pair< long, long > >
#define mp make_pair
#define pb push_back
const long INFI = 2000000000;
const long NMAX = 50001;
ifstream fin(INPUT);
ofstream fout(OUTPUT);
long N, M, Poz, Cont;
lp List[ NMAX ];
long Heap[ NMAX ], PHeap[ NMAX ], Final[ NMAX ];
int vis[ NMAX ];
void readData()
{
long Node1, Node2, Cost;
fin >> N >> M;
for(;M--;)
{
fin >> Node1 >> Node2 >> Cost;
List[ Node1 ].pb(mp(Node2, Cost));
}
}
void AddHeap(long _X)
{
long p = _X;
while( p >= 1)
{
if(Final[ Heap[ p / 2 ] ] > Final[ Heap[ p ] ])
{
swap( Heap[ p / 2 ], Heap[ p ] );
PHeap[ Heap[ p/2] ] = p/2;
PHeap[ Heap[ p ] ] = p;
p /=2;
}
else return;
}
}
void ExtractHeap(long _X)
{
long P;
long p = _X;
while(p <= Poz)
{
if(2 * p <= Poz)
{
P = 2 * p;
if(P + 1 <= Poz && Final[ Heap[ P + 1 ] ] < Final[ Heap[ P ]])
++P;
if(Final[Heap[ P ]] < Final[Heap[ p ]])
{
swap( Heap[ P ], Heap[ p ] );
PHeap[ Heap[ P ] ] = P;
PHeap[ Heap[ p ] ] = p;
p = P;
}
else return;
}
else return;
}
}
void solve()
{
for(long i = 1; i <= N; ++i)
Final[ i ] = INFI, vis[ i ] = 0;
Poz = 0;
Cont = 0;
long Node;
Final[ 1 ] = 0;
Heap[ ++Poz ] = 1;
PHeap[ 1 ] = Poz;
lp::iterator it;
vis[ 1 ] = 1;
for(;Poz;)
{
Node = Heap[ 1 ];
Heap[ 1 ] = Heap[ Poz-- ];
ExtractHeap(1);
for(it = List[ Node ].begin(); it != List[ Node ].end(); ++it)
if(!vis[ (*it).first ])
{
Heap[ ++Poz ] = (*it).first;
vis[ (*it).first ] = 1;
PHeap[ (*it).first ] = Poz;
Final[ (*it).first ] = Final[ Node ] + (*it).second;
AddHeap( Poz );
}
else
if(Final[ (*it).first ] > Final[ Node ] + (*it).second)
{
Final[ (*it).first ] = Final[ Node ] + (*it).second;
AddHeap( PHeap[ (*it).first ]);
}
}
for(long i = 2; i <= N; ++i)
if(Final[ i ] != INFI) fout << Final[ i ] << " ";
else fout << "0 ";
fout << "\n";
}
int main()
{
readData();
solve();
fin.close();
fout.close();
return 0;
}