赞
踩
题目给出一个无向连通图,要求求出其最小生成树的权值。
温馨提示:本题请使用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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。