Pagini recente » Cod sursa (job #804396) | Cod sursa (job #1948543) | Cod sursa (job #1962037) | Cod sursa (job #1116545) | Cod sursa (job #1486468)
#include <bits/stdc++.h>
using namespace std;
struct node{
node *next;
int to;
int length;
};
node *a[50005];
long long d[50005];
int poz[50005];
int h[50005], k;
void percolate(int i) {
int tata;
while(i > 1) {
tata = i >> 1;
if(d[h[tata]] > d[h[i]]) {
poz[h[tata]] = i;
poz[h[i]] = tata;
int aux = h[i];
h[i] = h[tata];
h[tata] = aux;
i = tata;
}
else i = 1;
}
}
void sift(int i) {
int son;
while(i <= k) {
son = i;
if((i << 1) <= k) {
son = i << 1;
if(son < k)
if(d[h[son]] > d[h[son + 1]])
son ++;
if(d[h[son]] < d[h[i]]) {
poz[h[son]] = i;
poz[h[i]] = son;
int aux = h[son];
h[son] = h[i];
h[i] = aux;
i = son;
}
else return;
}
else return;
}
}
int main()
{
FILE *f = fopen("dijkstra.in", "r");
FILE *g = fopen("dijkstra.out", "w");
int n, m;
fscanf(f, "%d %d", &n, &m);
for(int i = 1; i <= m; i ++) {
int from, to, length;
fscanf(f, "%d %d %d", &from, &to, &length);
node *one = new node;
one->to = to;
one->length = length;
one->next = a[from];
a[from] = one;
}
for(int i = 2; i <= n; i ++) {
d[i] = 50000005;
poz[i] = -1;
}
poz[1] = 1;
h[++ k] = 1;
while ( k )
{
int mn = h[1];
h[1] = h[k];
poz[ h[1] ] = 1;
--k;
sift(1);
node *q = a[mn];
while ( q )
{
if ( d[q->to] > d[mn] + q->length )
{
d[q->to] = d[mn] + q->length;
if ( poz[q->to] != -1 )
percolate( poz[q->to] );
else
{
h[++k] = q->to;
poz[ h[k] ] = k;
percolate( k );
}
}
q = q->next;
}
}
for(int i = 2; i <= n; i ++) {
if(d[i] == 50000005)
fprintf(g, "0 ");
else fprintf(g, "%d ", d[i]);
}
fprintf(g, "\n");
return 0;
}