1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
#include <stdio.h>
#include <stdlib.h>
#define niesk 1000000000
int *N, np;
long long int *D;
int najmniejszy();
void Dijkstra(int, int);
int m, n,start,koniec;
//wierzchołki n ## krawędzie m
struct S_kraw
{
int gdzie;
int waga;
};
struct S_wierz
{
int ile_kraw;
struct S_kraw *kraw;
void dodaj_kraw(int,int);
void zwolnij_pamiec();
};
struct S_wierz *wierz;
void S_wierz::dodaj_kraw(int dest,int length)
{
this->ile_kraw++;
this->kraw = (struct S_kraw *) realloc(this->kraw,((sizeof(struct S_kraw))*(this->ile_kraw)));
this->kraw[this->ile_kraw-1].gdzie = dest;
this->kraw[this->ile_kraw-1].waga = length;
}
void S_wierz::zwolnij_pamiec()
{
free(this->kraw);
this->kraw = NULL;
}
int main()
{
int zestawy;
scanf("%d" , &zestawy);
for(int i=0;i<zestawy;i++)
{
scanf("%d",&n);
scanf("%d",&m);
scanf("%d",&start);
scanf("%d",&koniec);
wierz = new struct S_wierz[n];
for(int i=0; i<n ;i++)
{
wierz[i].ile_kraw = 0;
wierz[i].kraw = NULL;
}
int a, b, c, dw;
for(int i=0; i<m; i++)
{
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
scanf("%d",&dw);
if(m==1){printf("%d\n",c);goto jedna;}
wierz[(a-1)].dodaj_kraw((b-1),c);
if (dw==2) wierz[(b-1)].dodaj_kraw((a-1),c);
}
Dijkstra(start-1, n);
printf("%d\n",D[koniec-1]);
delete[] D,N;
jedna:{}
}
return 0;
}
// s szukamy drogi od wirzchołka wirzchołka(tablica od 0), n ilość wierzchołków
void Dijkstra(int s, int n)
{
np = 0;
D = new long long int[n];
N = new int[n];
for(int i=0; i<n; i++)
D[i] = niesk;
for(int i=0; i<wierz[s].ile_kraw; i++)
D[wierz[s].kraw[i].gdzie] = wierz[s].kraw[i].waga;
D[s] = 0;
for(int i=0; i<n; i++)
{
if(i==s)
continue;
N[np++] = i;
}
while(np>0)
{
int i = najmniejszy();
for(int k=0; k<wierz[i].ile_kraw; k++)
if(D[wierz[i].kraw[k].gdzie] > D[i]+wierz[i].kraw[k].waga)
D[wierz[i].kraw[k].gdzie] = D[i]+wierz[i].kraw[k].waga;
}
}
int najmniejszy()
{
int val, num, result;
val = niesk;
for(int i=0; i<np; i++)
{
if(D[N[i]] < val)
{
val = D[N[i]];
num = i;
}
}
result = N[num];
np--;
N[num] = N[np];
return result;
}
|