已经判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;
}