zoukankan      html  css  js  c++  java
  • Codeforces 707B. Bakery

    题目链接:http://codeforces.com/problemset/problem/707/B

    题意:

      给你一个含有 n 个点, m 条边的无向带权图,以及 k 个点, 这 n 个点代表着 n 个城市, 边和权值代表着两个城市之间的路以及距离, k 个点代表着 n 个城市中有 k 个城市有面包店, 某人站在没有面包店的某个城市, 问你他到具有面包店的城市的最短距离.

    思路:

      把这 m 条边按照权值从小到大排序,然后依次检查每条边的两个端点,如果满足其中一个具有面包点,且其另外一个不具有,那么最短距离就是最先找到的那个.

    代码:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 const int MAXN = 100000;
     6 typedef long long LL;
     7 
     8 struct NODE { int u;int v; int l;} ;
     9 NODE edge[MAXN + 3];
    10 
    11 int cmp(NODE a, NODE b) { return a.l < b.l; }
    12 
    13 int main() {
    14     ios_base::sync_with_stdio(0); cin.tie(0);
    15     int n, m, k; cin >> n >> m >> k;
    16     int back[MAXN + 3];
    17     for(int i = 0; i < m; i++) cin >> edge[i].u >> edge[i].v >> edge[i].l;
    18     for(int i = 0; i < k; i++) cin >> back[i];
    19     sort(edge, edge + m, cmp);
    20     sort(back, back + k);
    21     int ans = -1;
    22     for(int i = 0; i < m; i++) {//从最短的开始检查
    23         int flag1 = lower_bound(back, back + k, edge[i].u) - back;
    24         int flag2 = lower_bound(back, back + k, edge[i].v) - back;
    25         if(back[flag1] == edge[i].u && back[flag2] != edge[i].v || back[flag1] != edge[i].u && back[flag2] == edge[i].v) {//是否满足一个具有面包店,另外一个不具有
    26             ans = edge[i].l;
    27             break;
    28         }
    29     }
    30     cout << ans << endl;
    31     return 0;
    32 }
  • 相关阅读:
    Linux中使用dd制作文件的.img
    python正则表达式
    使用@property
    Win10添加删除虚拟打印机方法
    jenkins权限
    RedHat7.2下Jenkins的安装配置
    jenkins忘记管理员账号密码的补救方法
    RHEL软件安装
    docker 常用指令(RHLE)
    /var/run/yum.pid 已被锁定,PID 为 4242 的另一个程序正在运行
  • 原文地址:https://www.cnblogs.com/Ash-ly/p/5828307.html
Copyright © 2011-2022 走看看