題目連接:https://vjudge.net/problem/POJ-1287node
思路:最小生成樹板子題ios
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <stack> #include <string> #include <map> #include <cmath> #include <iomanip> using namespace std; typedef long long LL; #define inf 1e9 #define rep(i,j,k) for(int i = (j); i <= (k); i++) #define rep__(i,j,k) for(int i = (j); i < (k); i++) #define per(i,j,k) for(int i = (j); i >= (k); i--) #define per__(i,j,k) for(int i = (j); i > (k); i--) const int N = 60; int head[N]; int dis[N]; bool vis[N]; int cnt; int n,m; struct Edge{ int to; int w; int nxt; }e[N*N]; struct node{ int u; int w; friend bool operator<(const node& a,const node& b){ return a.w > b.w; } }; priority_queue<node> que; void add(int u,int v,int w){ e[cnt].to = v; e[cnt].w = w; e[cnt].nxt = head[u]; head[u] = cnt++; } int prime(){ while(!que.empty()) que.pop(); rep(i,1,n){ vis[i] = false; dis[i] = inf; } dis[1] = 0; que.push(node{1,dis[1]}); int u,v,w; while(!que.empty()){ u = que.top().u; que.pop(); if(vis[u]) continue; vis[u] = true; for(int o = head[u]; ~o; o = e[o].nxt){ v = e[o].to; w = e[o].w; if(!vis[v] && dis[v] > w){ dis[v] = w; que.push(node{v,dis[v]}); } } } int ans = 0; rep(i,1,n) ans += dis[i]; return ans; } int main(){ ios::sync_with_stdio(false); cin.tie(0); int u,v,w; while(cin >> n && n){ cin >> m; rep(i,1,n) head[i] = -1; cnt = 0; rep(i,1,m){ cin >> u >> v >> w; add(u,v,w); add(v,u,w); } cout << prime() << endl; } return 0; }