[20180824] noip模拟赛 Oasis

本文详细解析了在NOIP模拟赛Oasis中,如何使用最短路径算法解决特定问题。通过从k个关键点出发,利用广度优先搜索(BFS)算法计算到所有其他点的最短距离,最终确定每个点的最大距离,从而得到全局最优解。文章提供了完整的代码实现,并介绍了算法的具体步骤。


显然直接从这k个点分别跑一下到其他点的最短路即可

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 2e5 + 10, inf = 0x3f3f3f3f;
 4 int head[N], rest[N], to[N], tot;
 5 int n, m, k, lz[N];
 6 int dis[N], ans[N];
 7 
 8 void add(int u, int v) {
 9     to[++ tot] = v, rest[tot] = head[u], head[u] = tot;
10 }
11 
12 void bfs(int S) {
13     for(int i = 1 ; i <= n ; ++ i) dis[i] = inf;
14     dis[S] = 0;
15     queue<int> q;
16     q.push(S);
17     while(q.size()) {
18         int u = q.front(); q.pop();
19         for(int i = head[u] ; i ; i = rest[i]) {
20             int v = to[i];
21             if(dis[v] == inf) {
22                 dis[v] = dis[u] + 1;
23                 q.push(v);
24             }
25         }
26     }
27     for(int i = 1 ; i <= n ; ++ i) ans[i] = max(ans[i], dis[i]);
28 }
29 
30 int main() {
31     scanf("%d%d%d", &n, &m, &k);
32     for(int i = 1 ; i <= k ; ++ i) scanf("%d", &lz[i]);
33     for(int i = 1 ; i <= m ; ++ i) {
34         int u, v;
35         scanf("%d%d", &u, &v);
36         add(u, v), add(v, u);
37     }
38     for(int i = 1 ; i <= k ; ++ i) bfs(lz[i]);
39     for(int i = 1 ; i <= n ; ++ i) {
40         printf("%d", ans[i]);
41         if(i < n) putchar(' ');
42     }
43 }
[20180824] noip模拟赛 Oasis

转载于:https://www.cnblogs.com/KingSann/articles/9530359.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值