prim+堆优化,t+wa,30pts
查看原帖
prim+堆优化,t+wa,30pts
384214
esquigybcu楼主2021/8/7 23:10

已经判orz

// Prim
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
using std::priority_queue;
using std::min;

const int MAXN = 5e3 + 5, MAXM = 2e5 + 5;
int n, m;

struct edge
{
    int u, v, w, next;
}
e[MAXM]; int pos;
int head[MAXN], dis[MAXN];
bool vis[MAXN];

struct point
{
    int u, dis;
    point(int u, int dis){this -> u = u, this -> dis = dis;}
};
bool operator<(const point& p, const point& q)
{
    return p.dis < q.dis;
}
priority_queue<point> pq;

void add_edge(int u, int v, int w)
{
    e[pos].u = u, e[pos].v = v, e[pos].w = w, e[pos].next = head[u];
    head[u] = pos;
    pos++;
}

int prim()
{
    int points = 1, ans = 0;
    dis[1] = 0;
    pq.push(point(1, 0));
    while (!pq.empty() && points <= n)
    {
        int u = pq.top().u, dist = pq.top().dis;
        // printf("u = %d, dist = %d\n", u, dist);
        pq.pop();
        if (dist > dis[u] || vis[u])
            continue;
        points++;
        ans += dist;
        vis[u] = 1;
        for (int i = head[u]; ~i; i = e[i].next)
        {
            int v = e[i].v;
            // printf("v = %d\n", v);
            if (e[i].w < dis[v])
            {
                dis[v] = e[i].w;
                pq.push(point(v, e[i].w));
            }
        }
    }
    if (points < n)
        ans = -1;
    return ans;
}

int main()
{
    memset(e, -1, sizeof e);
    memset(head, -1, sizeof head);
    memset(dis, 0x7f, sizeof dis);

    int u, v, w;
    scanf("%d %d", &n, &m);
    for (int i = 0; i < m; i++)
    {
        scanf("%d %d %d", &u, &v, &w);
        add_edge(u, v, w);
        add_edge(v, u, w);
    }
    int ans = prim();
    if (ans == -1)
        printf("orz");
    else
        printf("%d", ans);
    return 0;
}
2021/8/7 23:10
加载中...