标签:
题目链接: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 }
标签:
原文地址:http://www.cnblogs.com/Ash-ly/p/5828307.html