Pagini recente » Cod sursa (job #2517852) | Cod sursa (job #242919) | Cod sursa (job #2937005) | Cod sursa (job #1111998) | Cod sursa (job #1012308)
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
const int NMAX = 50000,INF = (1 << 30);
struct GRAPH { int node, cost; };
vector <GRAPH> graph[NMAX+ 5];
vector <GRAPH>::iterator it;
GRAPH heap[4 * NMAX + 10];
int pos[NMAX + 10], vis[NMAX + 5], dmin[NMAX + 5],n,hSize;
void swapNodes (int x, int y) {
swap(heap[pos[x]],heap[pos[y]]);
swap(pos[x],pos[y]);
}
void up (int p) {
int father = p / 2;
while(father && heap[father].cost > heap[p].cost) {
swapNodes(p,father);
father = p / 2;
p /= 2;
}
}
void getSons (int node, int &left, int &right) {
left = node * 2;
right = left + 1;
if(left > hSize)
left = 0;
if(right > hSize)
right = 0;
}
void down (int p) {
int left,right;
getSons(p,left,right);
while(heap[p].cost < heap[left].cost || heap[p].cost < heap[right].cost) {
if(heap[left].cost < heap[right].cost) {
swapNodes(p,left);
p = left;
}
else {
swapNodes(p,right);
p = right;
}
getSons(p,left,right);
}
}
void insert(int node, int val) {
heap[++hSize] = {node,val};
up(hSize);
}
void update (int node) {
if(pos[node] == 0)
insert(node,dmin[node]);
else {
heap[pos[node]].cost = dmin[node];
up(pos[node]);
}
}
void del () {
pos[heap[1].node] = 0;
swap(heap[1],heap[hSize]);
hSize--;
down(1);
}
void dijkstra (int start) {
int i,node;
heap[0] = {INF, INF};
for(i = 1; i <= n; i++)
dmin[i] = INF;
dmin[1] = 0;
update(1);
node = start;
while(node) {
for(it = graph[node].begin(); it < graph[node].end(); it++)
if(it -> cost + dmin[node] < dmin[it -> node]) {
dmin[it -> node] = it -> cost + dmin[node];
update(it -> node);
}
del();
node = heap[1].node;
vis[node] = 1;
}
}
int main() {
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
int a,b,c,m,i;
scanf("%d%d",&n,&m);
for(i = 1; i <= m; i++) {
scanf("%d%d%d",&a,&b,&c);
graph[a].push_back({b,c});
}
dijkstra(1);
for(i = 2; i <= n; i++) {
if(!vis[i])
dmin[i] = 0;
printf("%d ",dmin[i]);
}
return 0;
}