#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct Queue Queue;
struct Queue {
int data;
int priority;
Queue *next;
};
Queue *queue_new(int d, int p)
{
Queue
*n
= malloc(sizeof(*n
));
n->data = d;
n->priority = p;
n->next = NULL;
return n;
}
int queue_pop(Queue **head)
{
Queue *old = *head;
int res = old->data;
*head = (*head)->next;
return res;
}
void queue_remove(Queue **head, int data)
{
while (*head && (*head)->data != data) {
head = &(*head)->next;
}
if (*head) queue_pop(head);
}
void queue_push(Queue **head, int d, int p)
{
Queue *q = queue_new(d, p);
while (*head && (*head)->priority < p) {
head = &(*head)->next;
}
q->next = *head;
*head = q;
}
int queue_empty(Queue *head)
{
return (head == NULL);
}
void queue_print(const Queue *q)
{
while (q) {
printf("%d[%d] ", q
->data
, q
->priority
); q = q->next;
}
}
typedef struct Graph Graph;
typedef struct Edge Edge;
struct Edge {
int vertex;
int weight;
Edge *next;
};
struct Graph {
int v;
Edge **edge;
int *dist;
int *path;
};
Graph *graph_new(int v)
{
Graph
*G
= malloc(sizeof(*G
));
G->v = v;
G
->edge
= calloc(v
, sizeof(*G
->edge
)); G
->dist
= calloc(v
, sizeof(*G
->dist
)); G
->path
= calloc(v
, sizeof(*G
->path
));
return G;
}
void graph_delete(Graph *G)
{
if (G) {
for (int i = 0; i < G->v; i++) {
Edge *e = G->edge[i];
while (e) {
Edge *old = e;
e = e->next;
}
}
}
}
Edge *edge_new(int vertex, int weight, Edge *next)
{
e->vertex = vertex;
e->weight = weight;
e->next = next;
return e;
}
void graph_edge(Graph *G, int u, int v, int w)
{
G->edge[u] = edge_new(v, w, G->edge[u]);
G->edge[v] = edge_new(u, w, G->edge[v]);
}
void dijkstra(const Graph *G, int s)
{
Queue *queue = NULL;
for (int i = 0; i < G->v; i++) G->dist[i] = -1;
G->dist[s] = 0;
queue_push(&queue, s, 0);
while (!queue_empty(queue)) {
int v = queue_pop(&queue);
Edge *e = G->edge[v];
while (e) {
int w = e->vertex;
int d = G->dist[v] + e->weight;
if (G->dist[w] == -1) {
G->dist[w] = d;
G->path[w] = v;
queue_push(&queue, w, d);
}
if (G->dist[w] > d) {
G->dist[w] = d;
G->path[w] = v;
queue_remove(&queue, w);
queue_push(&queue, w, d);
}
e = e->next;
}
}
}
int main()
{
int t;
while (t--) {
Graph *G;
int v, e, s;
G = graph_new(v);
for (int i = 0; i < e; i++) {
int u, v, w;
scanf("%d %d %d", &u
, &v
, &w
); graph_edge(G, u - 1, v - 1, w);
}
dijkstra(G, s - 1);
for (int i = 0; i < G->v; i++) {
if (i != s - 1) {
}
}
graph_delete(G);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+IAojaW5jbHVkZSA8c3RkbGliLmg+IAojaW5jbHVkZSA8YXNzZXJ0Lmg+IAoKdHlwZWRlZiBzdHJ1Y3QgUXVldWUgUXVldWU7CgpzdHJ1Y3QgUXVldWUgewogICAgaW50IGRhdGE7CiAgICBpbnQgcHJpb3JpdHk7CiAgICBRdWV1ZSAqbmV4dDsKfTsKClF1ZXVlICpxdWV1ZV9uZXcoaW50IGQsIGludCBwKQp7CiAgICBRdWV1ZSAqbiA9IG1hbGxvYyhzaXplb2YoKm4pKTsKCiAgICBuLT5kYXRhID0gZDsKICAgIG4tPnByaW9yaXR5ID0gcDsKICAgIG4tPm5leHQgPSBOVUxMOwoKICAgIHJldHVybiBuOwp9CgppbnQgcXVldWVfcG9wKFF1ZXVlICoqaGVhZCkKewogICAgYXNzZXJ0KCpoZWFkKTsKICAgIAogICAgUXVldWUgKm9sZCA9ICpoZWFkOwogICAgaW50IHJlcyA9IG9sZC0+ZGF0YTsKICAgIAogICAgKmhlYWQgPSAoKmhlYWQpLT5uZXh0OwogICAgZnJlZShvbGQpOwogICAgCiAgICByZXR1cm4gcmVzOwp9Cgp2b2lkIHF1ZXVlX3JlbW92ZShRdWV1ZSAqKmhlYWQsIGludCBkYXRhKQp7CiAgICB3aGlsZSAoKmhlYWQgJiYgKCpoZWFkKS0+ZGF0YSAhPSBkYXRhKSB7CiAgICAgICAgaGVhZCA9ICYoKmhlYWQpLT5uZXh0OwogICAgfQogICAgCiAgICBpZiAoKmhlYWQpIHF1ZXVlX3BvcChoZWFkKTsKfQoKdm9pZCBxdWV1ZV9wdXNoKFF1ZXVlICoqaGVhZCwgaW50IGQsIGludCBwKQp7CiAgICBRdWV1ZSAqcSA9IHF1ZXVlX25ldyhkLCBwKTsKCiAgICB3aGlsZSAoKmhlYWQgJiYgKCpoZWFkKS0+cHJpb3JpdHkgPCBwKSB7CiAgICAgICAgaGVhZCA9ICYoKmhlYWQpLT5uZXh0OwogICAgfQogICAgCiAgICBxLT5uZXh0ID0gKmhlYWQ7CiAgICAqaGVhZCA9IHE7Cn0KCgppbnQgcXVldWVfZW1wdHkoUXVldWUgKmhlYWQpCnsKICAgIHJldHVybiAoaGVhZCA9PSBOVUxMKTsKfQoKdm9pZCBxdWV1ZV9wcmludChjb25zdCBRdWV1ZSAqcSkKewogICAgd2hpbGUgKHEpIHsKICAgICAgICBwcmludGYoIiVkWyVkXSAiLCBxLT5kYXRhLCBxLT5wcmlvcml0eSk7CiAgICAgICAgcSA9IHEtPm5leHQ7CiAgICB9CiAgICAKICAgIHB1dHMoIiQiKTsKfQoKdHlwZWRlZiBzdHJ1Y3QgR3JhcGggR3JhcGg7CnR5cGVkZWYgc3RydWN0IEVkZ2UgRWRnZTsKCnN0cnVjdCBFZGdlIHsKICAgIGludCB2ZXJ0ZXg7CiAgICBpbnQgd2VpZ2h0OwogICAgRWRnZSAqbmV4dDsKfTsKCnN0cnVjdCBHcmFwaCB7CiAgICBpbnQgdjsKICAgIEVkZ2UgKiplZGdlOwogICAgaW50ICpkaXN0OwogICAgaW50ICpwYXRoOwp9OwoKR3JhcGggKmdyYXBoX25ldyhpbnQgdikKewogICAgR3JhcGggKkcgPSBtYWxsb2Moc2l6ZW9mKCpHKSk7CiAgICAKICAgIEctPnYgPSB2OwogICAgRy0+ZWRnZSA9IGNhbGxvYyh2LCBzaXplb2YoKkctPmVkZ2UpKTsKICAgIEctPmRpc3QgPSBjYWxsb2Modiwgc2l6ZW9mKCpHLT5kaXN0KSk7CiAgICBHLT5wYXRoID0gY2FsbG9jKHYsIHNpemVvZigqRy0+cGF0aCkpOwogICAgCiAgICByZXR1cm4gRzsKfQoKdm9pZCBncmFwaF9kZWxldGUoR3JhcGggKkcpCnsKICAgIGlmIChHKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHLT52OyBpKyspIHsKICAgICAgICAgICAgRWRnZSAqZSA9IEctPmVkZ2VbaV07CiAgICAgICAgICAgIAogICAgICAgICAgICB3aGlsZSAoZSkgewogICAgICAgICAgICAgICAgRWRnZSAqb2xkID0gZTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZSA9IGUtPm5leHQ7CiAgICAgICAgICAgICAgICBmcmVlKG9sZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKICAgICAgICBmcmVlKEctPmVkZ2UpOwogICAgICAgIGZyZWUoRy0+ZGlzdCk7CiAgICAgICAgZnJlZShHLT5wYXRoKTsKICAgICAgICBmcmVlKEcpOwogICAgfQp9CgpFZGdlICplZGdlX25ldyhpbnQgdmVydGV4LCBpbnQgd2VpZ2h0LCBFZGdlICpuZXh0KQp7CiAgICBFZGdlICplID0gbWFsbG9jKHNpemVvZigqZSkpOwogICAgCiAgICBlLT52ZXJ0ZXggPSB2ZXJ0ZXg7CiAgICBlLT53ZWlnaHQgPSB3ZWlnaHQ7CiAgICBlLT5uZXh0ID0gbmV4dDsKCiAgICByZXR1cm4gZTsKfQoKdm9pZCBncmFwaF9lZGdlKEdyYXBoICpHLCBpbnQgdSwgaW50IHYsIGludCB3KQp7CiAgICBHLT5lZGdlW3VdID0gZWRnZV9uZXcodiwgdywgRy0+ZWRnZVt1XSk7CiAgICBHLT5lZGdlW3ZdID0gZWRnZV9uZXcodSwgdywgRy0+ZWRnZVt2XSk7Cn0KCnZvaWQgZGlqa3N0cmEoY29uc3QgR3JhcGggKkcsIGludCBzKQp7CiAgICBRdWV1ZSAqcXVldWUgPSBOVUxMOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRy0+djsgaSsrKSBHLT5kaXN0W2ldID0gLTE7CiAgICBHLT5kaXN0W3NdID0gMDsKICAgIAogICAgcXVldWVfcHVzaCgmcXVldWUsIHMsIDApOwogICAgCiAgICB3aGlsZSAoIXF1ZXVlX2VtcHR5KHF1ZXVlKSkgewogICAgICAgIGludCB2ID0gcXVldWVfcG9wKCZxdWV1ZSk7CiAgICAgICAgRWRnZSAqZSA9IEctPmVkZ2Vbdl07CiAgICAgICAgCiAgICAgICAgd2hpbGUgKGUpIHsKICAgICAgICAgICAgaW50IHcgPSBlLT52ZXJ0ZXg7CiAgICAgICAgICAgIGludCBkID0gRy0+ZGlzdFt2XSArIGUtPndlaWdodDsKCiAgICAgICAgICAgIGlmIChHLT5kaXN0W3ddID09IC0xKSB7CiAgICAgICAgICAgICAgICBHLT5kaXN0W3ddID0gZDsKICAgICAgICAgICAgICAgIEctPnBhdGhbd10gPSB2OwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBxdWV1ZV9wdXNoKCZxdWV1ZSwgdywgZCk7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9IAogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKEctPmRpc3Rbd10gPiBkKSB7CiAgICAgICAgICAgICAgICBHLT5kaXN0W3ddID0gZDsKICAgICAgICAgICAgICAgIEctPnBhdGhbd10gPSB2OwoKICAgICAgICAgICAgICAgIHF1ZXVlX3JlbW92ZSgmcXVldWUsIHcpOwogICAgICAgICAgICAgICAgcXVldWVfcHVzaCgmcXVldWUsIHcsIGQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBlID0gZS0+bmV4dDsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgaW50IHQ7CgogICAgc2NhbmYoIiVkIiwgJnQpOwoKICAgIHdoaWxlICh0LS0pIHsKICAgICAgICBHcmFwaCAqRzsKICAgICAgICBpbnQgdiwgZSwgczsKICAgICAgICAKICAgICAgICBzY2FuZigiJWQgJWQiLCAmdiwgJmUpOwogICAgICAgIAogICAgICAgIEcgPSBncmFwaF9uZXcodik7CiAgICAgICAgCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlOyBpKyspIHsKICAgICAgICAgICAgaW50IHUsIHYsIHc7CiAgICAgICAgICAgIAogICAgICAgICAgICBzY2FuZigiJWQgJWQgJWQiLCAmdSwgJnYsICZ3KTsKICAgICAgICAgICAgZ3JhcGhfZWRnZShHLCB1IC0gMSwgdiAtIDEsIHcpOwogICAgICAgIH0KCiAgICAgICAgc2NhbmYoIiVkIiwgJnMpOwogICAgICAgIGRpamtzdHJhKEcsIHMgLSAxKTsKICAgICAgICAKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEctPnY7IGkrKykgewogICAgICAgICAgICBpZiAoaSAhPSBzIC0gMSkgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCBHLT5kaXN0W2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIAogICAgICAgIHB1dHMoIiIpOwogICAgICAgIGdyYXBoX2RlbGV0ZShHKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=