题目描述

Farmer John 要把他的牛奶运输到各个销售点。运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点。 运输的总距离越小,运输的成本也就越低。Farmer John 期望低成本的运输,但他并不想让他的竞争对手知道他具体的运输方案,所以他希望采用费用第二小的运输方案而不是最小的。现在请你帮忙找到该运输方案。

输入格式

第一行是两个整数 N,M,表示顶点数和边数;

接下来 M 行每行 33 个整数,x,y,z,表示一条路的两端 x,y 和距离 z。

输出格式

仅一行,输出第二小方案

分析

我的想法是暴力遍历,然后预置最短和次段路径迭代更新,然后成功TLE
大神的正确思路:
求次小生成树问题步骤:
1、求最小生成树,统计每条边是树边还是非树边,同时把最小生成树建出来。O(m)
2、预处理任意两点间的边权最大值dis[a][b]。O(n2) 用dfs或者bfs
3、依次枚举所有非树边,求min(sum+w-dis[a][b]),满足w>dis[a][b],因为这个题是要严格次小生成树。

样例

4 4
1 2 100
2 4 200
2 3 250
3 4 100
------------------------
450

代码

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const  int N = 510, M = 10010;int f[N];
struct node
{int x, y, dis;bool is_tree;bool operator<(const node& a) const{return dis < a.dis;}
}edge[M];
int n, m;
int dis[N][N], dis2[N][N];
int e[M], w[M], ne[M], h[N], len;void add(int a, int b, int c)
{e[len] = b;w[len] = c;ne[len] = h[a];h[a] = len++;
}void init()
{for (int i = 0; i < N; i++)f[i] = i;
}int find(int x)
{if (f[x] == x)return x;return f[x] = find(f[x]);
}void dfs(int u, int fa, int maxd1, int maxd2, int dis1[], int dis2[])
{dis1[u] = maxd1;dis2[u] = maxd2;for (int i = h[u]; ~i; i = ne[i]){int y = e[i];if (y != fa){//  cout << u << " " << y << endl;int td1 = maxd1, td2 = maxd2;int c = w[i];if (c > maxd1)td2 = td1, td1 = c;else if (c < maxd1 && c > maxd2)td2 = c;dfs(y, u, td1, td2, dis1, dis2);}}
}int main()
{cin >> n >> m;init();for (int i = 1; i <= m; i++){int a, b, c;cin >> a >> b >> c;edge[i] = { a, b, c };}long long sum = 0;memset(h, -1, sizeof h);sort(edge + 1, edge + m + 1);for (int i = 1; i <= m; i++){int x = find(edge[i].x);int y = find(edge[i].y);if (x != y){int a = edge[i].x;int b = edge[i].y;int z = edge[i].dis;f[x] = y;add(a, b, z);add(b, a, z);edge[i].is_tree = true;sum += edge[i].dis;}else edge[i].is_tree = false;}for (int i = 1; i <= n; i++) dfs(i, -1, -1e9, -1e9, dis[i], dis2[i]);long long ans = 1e18;for (int i = 1; i <= m; i++){if (!edge[i].is_tree){int z = edge[i].dis;int a = edge[i].x;int b = edge[i].y;if (z > dis[a][b])ans = min(ans, sum - dis[a][b] + z);else if (z > dis2[a][b])ans = min(ans, sum - dis2[a][b] + z);}}cout << ans << endl;return 0;
}

每日算法题(Day4)----秘密的牛奶运输相关推荐

  1. 秘密的牛奶运输 题解

    秘密的牛奶运输 农夫约翰要把他的牛奶运输到各个销售点. 运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的成本也就越低. 低成本的运输是农夫约翰所 ...

  2. 【次小生成树】4.秘密的牛奶运输

    题目描述 Farmer John 要把他的牛奶运输到各个销售点.运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的成本也就越低. Farmer J ...

  3. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...

    点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...

  4. acwing1148——秘密的牛奶运输(求次小生成树)

    https://www.acwing.com/problem/content/description/1150/ 农夫约翰要把他的牛奶运输到各个销售点. 运输过程中,可以先把牛奶运输到一些销售点,再由 ...

  5. 牛客竞赛每日俩题 - Day4

    14天阅读挑战赛 目录 模拟+辗转相除法 DP作图分析状态方程 找到只出现一次的字符: 模拟+辗转相除法 小易的升级之路_牛客题霸_牛客网 思路: 本题的能力值的累加分两种情况,一种是直接相加 bi, ...

  6. 每日算法题(Day16)----动物园

    题目描述 动物园里饲养了很多动物,饲养员小 A 会根据饲养动物的情况,按照<饲养指南>购买不同种类的饲料,并将购买清单发给采购员小 B. 具体而言,动物世界里存在 2k 种不同的动物,它们 ...

  7. 打牌博弈 dfs深度优先遍历搜索 排课表 拓扑排序 升序字符串 动态规划 剑指offer编程题整理 leetcode每日算法题

    递归,回溯, 深度优先搜索 题目描述 有一叠扑克牌,每张牌介于1和10之间 有四种出牌方法: 单出1张 出2张对子 出五张顺子,如12345 出三连对子,如112233 给10个数,表示1-10每种牌 ...

  8. 【蓝桥杯c++与Python每日练习】每日刷题day4:煤球数目,生日蜡烛,凑算式

    文章目录 一,煤球数目 二,生日蜡烛 三,凑算式 四,END

  9. 经典算法题每日演练——第六题 协同推荐SlopeOne 算法

    原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,"商品推荐","猜你喜欢&quo ...

最新文章

  1. QTP之web常用对象
  2. go语言入门经典_Go 语言中的 gRPC 基础入门
  3. java生成小图片_JAVA生成缩略小图片类
  4. C#通过属性名字符串获取、设置对象属性值
  5. Mac 获取 Brew
  6. STM32-SysTick定时器
  7. php for 循环 try_PHP基础案例四:展示学生列表
  8. 自学python能干些什么副业-学完Python的我,月薪6千,副业2万
  9. 在知行EDI系统中实施SNIP验证
  10. 《RunningMan》评论及弹幕情感分析
  11. ubuntu中颜色拾取器的安装以及16进制ARGB值在线转颜色
  12. Jmeter+badboy
  13. OPNsense用户手册-别名
  14. 【SAP-SD】物料 X 未对销售组织 XXXX 分销渠道 X 语言 DE 定义
  15. 【Love2D】第0章-从零开始学习Love2D
  16. Excel表设置公式连续自动计算
  17. opc服务器是硬件吗,opc是什么(一文彻底搞懂什么是OPC)
  18. 办公技巧:如何快速提取办公文档里面的所有图片
  19. 开通CSDN博客的第一篇文章以及博客名的由来
  20. 一文网尽CV/Robotics顶会论文常用高级词汇/句式!

热门文章

  1. Mosquitto安装
  2. 第三百二十四节,web爬虫,scrapy模块介绍与使用
  3. Mac 系统GoLand 打不开闪退
  4. Python基础_05:元祖
  5. [DevExpress使用随笔]之licenses.licx的处理
  6. obs多开教程_OBS多路推流插件
  7. 隐形车衣的这些参数,你了解吗?
  8. C#程序采用AOT发布,真的可以避免被反编译?
  9. flask+swagger
  10. 【数学竞赛】极限—等价无穷小