蓝桥杯 大臣的旅费(最短路)
来源:互联网 发布:win10禁止自动更新软件 编辑:程序博客网 时间:2024/05/16 15:13
题目地址:点击打开链接
思路:
就是要求一条最长路,可以从任意一点开始做一次最短路,找到最远的点,然后对这个最
远的点再做一次最短路,此时最远的路就是最长路。
代码:
#include<iostream>#include<vector>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int maxn = 1e4+5;const int INF = 0x3f3f3f3f;int n, dis[maxn];bool book[maxn];struct node{ int v, w; node() {} node(int vv, int ww): v(vv), w(ww) {}};vector<node> g[maxn];void spfa(int u){ memset(book, 0, sizeof(book)); for(int i = 1; i <= n; i++) dis[i] = INF; dis[u] = 0; queue<int> q; q.push(u); while(!q.empty()) { u = q.front(); q.pop(); book[u] = 0; for(int i = 0; i < g[u].size(); i++) { int v = g[u][i].v; int w = g[u][i].w; if(dis[u]+w < dis[v]) { dis[v] = dis[u]+w; if(!book[v]) { book[v] = 1; q.push(v); } } } }}int solve(){ spfa(1); int tmp = 0, tmpIndex; for(int i = 1; i <= n; i++) if(dis[i] > tmp) tmp = dis[i], tmpIndex = i; spfa(tmpIndex); int ans = 0; for(int i = 1; i <= n; i++) if(dis[i] > ans) ans = dis[i]; return ans*10+(1+ans)*ans/2;}int main(void){ while(cin >> n) { for(int i = 0; i < maxn; i++) g[i].clear(); for(int i = 1; i < n; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); g[u].push_back(node(v, w)); g[v].push_back(node(u, w)); } printf("%d\n", solve()); } return 0;}
0 0
- 蓝桥杯 大臣的旅费(最短路)
- 蓝桥杯 大臣的旅费
- 大臣的旅费 - 蓝桥杯
- 蓝桥杯 大臣的旅费
- 大臣的旅费 蓝桥杯
- 蓝桥杯 大臣的旅费
- 蓝桥杯 大臣的旅费
- 蓝桥杯 大臣的旅费
- 大臣的旅费--蓝桥杯
- 蓝桥杯+大臣的旅费
- 蓝桥杯大臣的旅费
- 蓝桥杯-大臣的旅费
- 蓝桥杯 大臣的旅费
- 蓝桥杯 大臣的旅费
- 蓝桥杯 大臣的旅费
- 【蓝桥杯】 大臣的旅费
- 蓝桥杯-大臣的旅费(DFS)
- 蓝桥杯 大臣的旅费(dfs)
- 105. Construct Binary Tree from Preorder and Inorder Traversal
- 我为什么要写博客
- c++vector类常见用法
- oracle存储过程中is和as的区别
- hadoop学习笔记之前期准备 ubuntu16.04虚拟机安装、WMwareTools安装及网络配置
- 蓝桥杯 大臣的旅费(最短路)
- C#设计模式—— 单例模式
- JS 中元素的各种位置尺寸宽高
- Ajax-note
- 1020. 月饼
- PAT甲级1055. The World's Richest (25)
- DPDK中文-DPDK工具
- 基数排序
- 深入理解Java虚拟机JVM高级特性与最佳实践阅读总结——第二章 Java内存区域与内存溢出异常