Pagini recente » Cod sursa (job #256674) | Cod sursa (job #681240) | Cod sursa (job #1047112) | Cod sursa (job #772829) | Cod sursa (job #2215119)
#include <stdio.h>
#include <string.h>
#define MASK 131071
///implementare interactiva 2.0.0
struct NodeData {
int Nod;
int Path;
} heap[50001];
struct Muchie {
int Vec;
int Cost;
} muchii[250001];
int nod[50001], prevy[250001];
char buf_mic[20];
int inHeap[50001];
char buff[MASK];
char outbuff[MASK];
int pos;
int outpos;
FILE *fin;
FILE *fout;
int poz[50001];
int heaplevel;
int heapsize;
inline void add(struct NodeData val);
inline void rmv(int nod);
inline void coborare(int nod);
inline void urcare(int nod);
inline void swap_nodes(int nod1,int nod2);
inline void swapu(int* a,int* b)
{
int man = *a;
*a=*b;
*b=man;
}
inline void add(struct NodeData val) {
heap[++heapsize].Nod = val.Nod;
heap[heapsize].Path = val.Path;
inHeap[val.Nod] = heapsize;
urcare(heapsize);
}
inline void rmv(int nod) {
swap_nodes(nod, heapsize);
heapsize--;
coborare(nod);
urcare(nod);
}
inline void coborare(int nod) {
/*while ((heap[nod].Path > heap[nod * 2].Path || heap[nod].Path > heap[nod * 2 + 1].Path) && nod * 2 <= heapsize) {
if (heap[nod * 2].Path < heap[nod * 2 + 1].Path) {
swap_nodes(nod * 2, nod);
nod = nod * 2;
} else {
swap_nodes(nod * 2 + 1, nod);
nod = nod * 2 + 1;
}
}*/
int son=0;
do
{
son=0;
if(2*nod+1 <= heapsize)
{
if(heap[2*nod].Path < heap[2*nod+1].Path)
{
son=2*nod;
}
else
{
son=2*nod+1;
}
}
else if(2*nod<=heapsize)
{
son=2*nod;
}
if(heap[nod].Path <= heap[son].Path)
{
son=0;
}
if(son)
{
swap_nodes(nod,son);
nod=son;
}
}while(son);
}
inline void urcare(int nod) {
while (heap[nod].Path < heap[nod / 2].Path && nod > 1) {
swap_nodes(nod / 2, nod);
nod = nod / 2;
}
}
inline void swap_nodes(int nod1,int nod2) {
swapu(&inHeap[heap[nod1].Nod], &inHeap[heap[nod2].Nod]);
swapu(&heap[nod1].Path, &heap[nod2].Path);
swapu(&heap[nod1].Nod, &heap[nod2].Nod);
}
inline void reader (int* nr) {
while(buff[pos] < '0' || buff[pos] > '9') {
pos++;
if (pos == MASK) {
fread (buff, 1, MASK, fin);
pos = 0;
}
}
int temp = 0;
while (buff[pos] >= '0' && buff[pos] <= '9') {
temp = temp * 10 + (buff[pos] - '0');
pos++;
if (pos == MASK) {
fread (buff, 1, MASK, fin);
pos = 0;
}
}
*nr = temp;
}
inline void writer (int nr) {
/*nr = 0;
int powerer = 1;
int temp = nr;
int rasturnat=0;
do
{
powerer*=10;
temp/=10;
}while(temp);
printf("%d ", powerer);
//powerer /= 10;
do {
outbuff[outpos++] = (nr/powerer) % 10 + '0';
nr %= powerer;
powerer /= 10;
if (outpos == MASK) {
fwrite (outbuff, 1, outpos, fout);
outpos = 0;
}
} while (nr);
outbuff[outpos++] = ' ';
if (outpos == MASK) {
fwrite (outbuff, 1, outpos, fout);
outpos = 0;
}*/
int nr_cif=0;
do
{
buf_mic[nr_cif++]=nr%10+'0';
nr/=10;
}while(nr);
int i;
for(i=nr_cif-1;i>=0;i--)
{
outbuff[outpos++]=buf_mic[i];
//printf("%d", outpos);
if (outpos == MASK) {
fwrite (outbuff, 1, outpos, fout);
outpos = 0;
}
}
outbuff[outpos++] = ' ';
if (outpos == MASK) {
fwrite (outbuff, 1, outpos, fout);
outpos = 0;
}
}
int main () {
fin = fopen("dijkstra.in", "r");
fout = fopen("dijkstra.out", "w");
fread (buff, 1, MASK, fin);
int Noduri, Muchii;
reader(&Noduri);
reader(&Muchii);
int i;
for (i = 0; i < Muchii; i++) {
int orig, dest, cost;
reader(&orig);
reader(&dest);
reader(&cost);
heaplevel++;
prevy[heaplevel] = nod[orig];
nod[orig] = heaplevel;
struct Muchie Cobai;
Cobai.Vec = dest;
Cobai.Cost = cost;
muchii[heaplevel] = Cobai;
}
struct NodeData Cobai;
Cobai.Nod = 1;
Cobai.Path = 0;
add(Cobai);
for (i = 2; i <= Noduri; i++) {
struct NodeData Cobai;
Cobai.Nod = i;
Cobai.Path = 1000000000;
add(Cobai);
}
///ce-i dezastru' asta nuclear
while (heapsize >= 1) {
int curNod = heap[1].Nod;
int ind = nod[heap[1].Nod];
rmv(1);
while (ind) {
int vecin = muchii[ind].Vec;
if (heap[inHeap[vecin]].Path > muchii[ind].Cost + heap[inHeap[curNod]].Path) {
heap[inHeap[vecin]].Path = muchii[ind].Cost + heap[inHeap[curNod]].Path;
coborare(inHeap[vecin]);
urcare(inHeap[vecin]);
}
ind = prevy[ind];
}
}
int destin;
for (destin = 2; destin <= Noduri; destin++) {
if (heap[inHeap[destin]].Path >= 1000000000)
writer(0);
else
writer(heap[inHeap[destin]].Path);
}
fwrite (outbuff, 1, outpos, fout);
fclose(fin);
fclose(fout);
return 0;
}