POJ 1251 Jungle Roads

题目链接:https://vjudge.net/problem/POJ-1251

思路:题目说路太多,需要去掉一些路,使得维修费用减少,前提需要所有乡村能相互到达,问最少需要

多少费用。最小生成树板子题。(本人习惯于直接打堆优化的)

  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 }

 

posted @ 2019-11-08 19:29  SummerMingQAQ  阅读(247)  评论(0编辑  收藏  举报