当前位置: 首页 > news >正文

衡水网站建设服务商百度推广开户渠道公司

衡水网站建设服务商,百度推广开户渠道公司,重庆十大房地产公司,沈阳网站设计外包链接 这是一个比较经典的题目。容易想到求出两段路径重合的部分,然后贪心的放权值。那么跑三次最短路,枚举重合部分的端点即可。 正解没什么好说的。这题有趣的地方在于,如果数据比较弱,可能会把一些错误做法放过去。 一种错误…

链接

这是一个比较经典的题目。容易想到求出两段路径重合的部分,然后贪心的放权值。那么跑三次最短路,枚举重合部分的端点即可。

正解没什么好说的。这题有趣的地方在于,如果数据比较弱,可能会把一些错误做法放过去。

一种错误做法是:只求 aaa 点和 ccc 点的单源最短路,然后在枚举端点的时候,认为端点一定在 a,ba,ba,b 或者 b,cb,cb,c 之间的最短路径上。这个结论是错误的,可以构造出这样的反例:

7 8 1 4 6
1 2 3 4 100 100 100 100
1 2
2 3
3 4
3 5
5 6
3 7
1 7
6 7

这里的答案显然是 131313,而错误做法可能会得到 111111111

这种构造的依据是最短路并不是唯一的。然而,即便最短路是唯一的,上面的做法依然不正确。不妨设 a,ba,ba,bb,cb,cb,c 两条最短路径共用了从点 mmm 到点 bbb 的路径,mmma,b,ca,b,ca,b,c 三个点的距离分别为 100,10,100100,10,100100,10,100,而在这两条路径外面有一个点 nnn,它到三个点的距离分别为 90,30,9090,30,9090,30,90,那么这个 nnn 点在上面的做法中是不会被遍历到的,但只需设计好权值,就可以使最优解经过这个点。

下面是正解的代码,最短路用 BFS 实现更好。

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
using ll = long long;
const int maxn = 2e5 + 5;
const ll inf = 1e18;
vector<int> g[maxn];
void solve() {int n, m, A, B, C;cin >> n >> m >> A >> B >> C;vector<ll> w(m);for (auto& i : w) cin >> i;for (int i = 1, u, v; i <= m; ++i) {cin >> u >> v;g[u].pb(v);g[v].pb(u);}sort(w.begin(), w.end());vector<int> disA(n + 1, 0x3f3f3f3f);vector<int> disB(n + 1, 0x3f3f3f3f);vector<int> disC(n + 1, 0x3f3f3f3f);vector<int> p(n + 1);function<void(int, vector<int>&)> dijkstra = [&](int s, vector<int>& d) {vector<int> vis(n + 1, 0);struct node {int id, dis;bool operator < (const node& rhs) const {return (dis == rhs.dis ? id > rhs.id : dis > rhs.dis);}};priority_queue<node> q;d[s] = 0;q.push({ s, 0 });while (!q.empty()) {auto [cur, cost] = q.top();q.pop();if (vis[cur]) continue;vis[cur] = 1;d[cur] = cost;for (auto to : g[cur]) {if (vis[to]) continue;if (d[to] > d[cur] + 1) {d[to] = d[cur] + 1;q.push({ to, d[to] });p[to] = cur;}}}};vector<ll> pre(m + 1, 0);for (int i = 1; i <= m; ++i) {pre[i] = pre[i - 1] + w[i - 1];}dijkstra(A, disA);dijkstra(B, disB);dijkstra(C, disC);ll ans = inf;for (int i = 1; i <= n; ++i) {int da = disA[i], db = disB[i], dc = disC[i];if (da + db + dc > m) continue;ans = min(ans, pre[db] + pre[da + db + dc]);}cout << ans << endl;for (int i = 1; i <= n; ++i) {g[i].clear();}
}
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T = 1;cin >> T;while (T--) {solve();}return 0;
}
http://www.hkea.cn/news/887297/

相关文章:

  • 网络营销的常用工具百度关键词优化点击 教程
  • 公司网站要怎么做少儿编程培训机构排名前十
  • 一个好的网站是什么样的商家联盟营销方案
  • 网站解除域名绑定网站广告收费标准
  • 郑州的建设网站有哪些手续免费发布推广信息的平台有哪些
  • 手机做网站软件优化服务平台
  • 网站图片装修的热切图怎么做营销技巧培训
  • 可以上传图片的网站怎么做百度关键词点击
  • 泉州网站制作广州seo网站开发
  • cuntlove wordpressseo外链发布工具
  • 购买一个网站空间如何可以多个域名使用吗长沙网站建设服务
  • 天津市建设委员会网站上海网站制作开发
  • 扬中网站建设墨子学院seo
  • 分析电子商务网站建设需求教案青岛今天发生的重大新闻
  • 汕头模板开发建站百度发布信息怎么弄
  • 健身网站开发项目总结关键词筛选工具
  • 重庆网站建设零臻靠谱国内永久免费的云服务器
  • 软件库合集软件资料2024郑州百度快照优化
  • 房地产开发公司网站建设方案seo去哪里学
  • 做网站可以赚钱吗百度小说搜索风云排行榜
  • 做网站交接需要哪些权限网站seo视频教程
  • 在网站怎么做收款二维码刷移动关键词优化
  • 问信息奥赛题怎么做 去哪个网站互联网网络推广
  • b2c电子商务网站系统下载专业网站seo推广
  • 引流推广的方法seo诊断工具
  • 平阴县建设工程网站直通车推广怎么做
  • 网站开发外包不给ftp高佣金app软件推广平台
  • 太原适合网站设计地址百度用户服务中心客服电话
  • 济南源码网站建设长沙网站seo推广公司
  • 北京网站制作17页和业务多一样的平台