题目给出一个无向连通图,要求求出其最小生成树的权值。
温馨提示:本题请使用prim最小生成树算法。
输入格式:
第一行包含两个整数 N(1<=N<=1x104),M(1<=M<=2x106) 表示该图共有 N 个结点和 M 条无向边。
接下来 M 行每行包含三个整数 Xi,Yi,Zi ,表示有一条长度为 Zi 的无向边连接结点 Xi,Yi 。
输出格式:
输出一个整数表示最小生成树的各边的长度之和。
输入样例:
4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3
输出样例:
7
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+10,M = 2e6+10;
struct Edge
{
int to,w;
bool operator < (const Edge &o) const
{
return w > o.w;
}
};
vector<Edge> edges[N]; // 存储邻接表信息
bool vis[N];
int dis[N];
int n,m;
void prim()
{
memset(dis, 0x3f, sizeof dis);
dis[1] = 0;
int res = 0;
priority_queue<Edge> q;
q.push({1,0});
while(!q.empty())
{
int t = q.top().to;
q.pop();
if(vis[t]) continue;
vis[t] = true;
res += dis[t];
for(auto &e : edges[t])
{
int k = e.to, w = e.w;
if(dis[k] > w)
{
dis[k] = w;
q.push({k, w});
}
}
}
printf("%d",res);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
edges[u].push_back({v,w});
edges[v].push_back({u,w});
}
prim();
return 0;
}