zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    克如斯卡尔 P1546
    真正的spfa
    第四课 最小生成树 要点
    关于vscode中nullptr未定义
    cmake学习笔记
    python学习笔记
    (BFS 图的遍历) 2906. kotori和迷宫
    (图论基础题) leetcode 997. Find the Town Judge
    (BFS DFS 并查集) leetcode 547. Friend Circles
    (BFS DFS 图的遍历) leetcode 841. Keys and Rooms
  • 原文地址:https://www.cnblogs.com/SSummerZzz/p/11822846.html
Copyright © 2011-2022 走看看