題目連接:https://vjudge.net/problem/POJ-1251node
思路:題目說路太多,須要去掉一些路,使得維修費用減小,前提須要全部鄉村能相互到達,問最少須要ios
多少費用。最小生成樹板子題。(本人習慣於直接打堆優化的)優化
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 #include <stack> 7 #include <string> 8 #include <map> 9 #include <cmath> 10 #include <iomanip> 11 using namespace std; 12 13 typedef long long LL; 14 #define inf 1e9 15 #define rep(i,j,k) for(int i = (j); i <= (k); i++) 16 #define rep__(i,j,k) for(int i = (j); i < (k); i++) 17 #define per(i,j,k) for(int i = (j); i >= (k); i--) 18 #define per__(i,j,k) for(int i = (j); i > (k); i--) 19 20 const int N = 30; 21 int head[N]; 22 int dis[N]; 23 bool vis[N]; 24 int cnt; 25 int n; 26 27 struct Edge{ 28 int to; 29 int w; 30 int nxt; 31 }e[N*N]; 32 33 struct node{ 34 int u; 35 int w; 36 37 friend bool operator<(const node& a,const node& b){ 38 return a.w > b.w; 39 } 40 }; 41 42 priority_queue<node> que; 43 44 void add(int u,int v,int w){ 45 e[cnt].to = v; 46 e[cnt].w = w; 47 e[cnt].nxt = head[u]; 48 head[u] = cnt++; 49 } 50 51 int prime(){ 52 53 while(!que.empty()) que.pop(); 54 55 rep(i,1,n){ 56 vis[i] = false; 57 dis[i] = inf; 58 } 59 dis[1] = 0; 60 que.push(node{1,dis[1]}); 61 62 int u,v,w; 63 while(!que.empty()){ 64 u = que.top().u; 65 que.pop(); 66 if(vis[u]) continue; 67 vis[u] = true; 68 for(int o = head[u]; ~o; o = e[o].nxt){ 69 v = e[o].to; 70 w = e[o].w; 71 72 if(!vis[v] && dis[v] > w){ 73 dis[v] = w; 74 que.push(node{v,dis[v]}); 75 } 76 } 77 } 78 79 int ans = 0; 80 rep(i,1,n) ans += dis[i]; 81 return ans; 82 } 83 84 int main(){ 85 86 ios::sync_with_stdio(false); 87 cin.tie(0); 88 89 char U,V; 90 int u,v; 91 int num,w; 92 while(cin >> n && n){ 93 94 rep(i,1,n) head[i] = -1; 95 cnt = 0; 96 97 rep(i,1,n-1){ 98 //開始點 數目 99 cin >> U >> num; 100 u = U - 'A' + 1; 101 rep(j,1,num){ 102 cin >> V >> w; 103 v = V - 'A' + 1; 104 add(u,v,w); 105 add(v,u,w); 106 } 107 } 108 109 cout << prime() << endl; 110 } 111 112 return 0; 113 }