救命,C语言手写堆不知道错在哪(2、3、4、6TLE,5WA)
查看原帖
救命,C语言手写堆不知道错在哪(2、3、4、6TLE,5WA)
402553
Jack_Yu楼主2021/9/19 12:30
#include <stdio.h>
#include <stdbool.h>

#define maxn 100010
#define maxm 200010
#define inf 123456789

typedef struct Edge{
    int v;
    int w;
    int next;
} Edge[maxm];
Edge edge;

bool check[maxn];
int Head[maxn], Heap[maxn], dis[maxn];
int cnt_of_list, cnt_of_heap;
int n, m, s;

void add(int u, int v, int w);
void HeapAdjust();
void PercDown(int i);
void DeleteMin();
void HeapInsert(int i);

int main()
{
    int u, v, w;
    scanf("%d%d%d", &n, &m, &s);
    for (int i = 1; i <= n; i++)
        dis[i] = inf;
    dis[s] = 0;
    dis[0] = -1;
    for (int i = 1; i <= m; i++)
    {
        scanf("%d%d%d", &u, &v, &w);
        add(u, v, w);
    }
    Heap[++cnt_of_heap] = s;
    while (cnt_of_heap)
    {
        u = Heap[1];
        check[u] = 1;
        DeleteMin();
        for (int i = Head[u]; i; i = edge[i].next)
        {
            if (check[edge[i].v] == 0)
            {
                v = edge[i].v;
                w = edge[i].w;
                if (dis[v] > dis[u] + w)
                {
                    dis[v] = dis[u] + w;
                    HeapInsert(v);
                }
            }
        }
        HeapAdjust();
    }

    for (int i = 1; i <= n; i++)
        printf("%d ", dis[i]);

    return 0;
}

void add(int u, int v, int w)
{
    edge[++cnt_of_list].v = v;
    edge[cnt_of_list].w = w;
    edge[cnt_of_list].next = Head[u];
    Head[u] = cnt_of_list;
}

void HeapAdjust()
{
    for (int i = cnt_of_heap / 2; i >= 1; i--)
        PercDown(i);
}

void PercDown(int i)
{
    int Child, Tmp;
    Tmp = Heap[i];
    while (i * 2 <= cnt_of_heap)
    {
        Child = i * 2;
        if (Child != cnt_of_heap && dis[Heap[Child]] > dis[Heap[Child + 1]])
            Child++;
        if (dis[Heap[Child]] < dis[Tmp])
        {
            Heap[i] = Heap[Child];
            i = Child;
        }
        else
            break;
    }
    Heap[i] = Tmp;
}

void DeleteMin()
{
    Heap[1] = Heap[cnt_of_heap--];
    PercDown(1);
}

void HeapInsert(int i)
{
    int Tmp = dis[i];
    int j;
    for (j = ++cnt_of_heap; j >= 1; j /= 2)
    {
        if (dis[Heap[j / 2]] > Tmp)
            Heap[j] = Heap[j / 2];
        else
            break;
    }
    Heap[j] = i;
}
2021/9/19 12:30
加载中...