原题链接:蓝桥杯2013年第四届真题-大臣的旅费
解题思路:
这个题目和HDU 4514:湫湫系列故事-设计风景线 这个题目所用的方法是一样的。
从题意可知,题目让求得是给出的图中最长路径。
题目中描述图连通,且有n-1条边。则对于一个连通块,我们可以选择从任意起点出发,求距该起点最远的点,
记为newStart。然后再从newStart出发,求距离newStart最远的点,这个距离就是图中任意两点距离中的最大
值。然后再算花费即可。这个题目虽然归类为难题。但是它真的不难。
注意事项:
数据范围
参考代码:
#include <iostream> #include <stdio.h> #include <algorithm> #include <queue> #include <string.h> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn = 1000000; int head[maxn],cnt,vis[maxn]; ll dist; struct Edge{ int v,nex; ll w; }edge[maxn*2]; typedef struct Node { int x; ll dis; }node; void addEdge(int u,int v,ll w) { edge[cnt].v = v; edge[cnt].w = w; edge[cnt].nex = head[u]; head[u] = cnt++; edge[cnt].v = u; edge[cnt].w = w; edge[cnt].nex = head[v]; head[v] = cnt++; } int bfs(int Start) { int source; node cur,nex; memset(vis,0,sizeof(vis)); queue<node>qu; cur.x = Start; cur.dis = 0; vis[Start] = 1; qu.push(cur); dist = 0; source = Start; int a,b; while(!qu.empty()) { cur = qu.front(); qu.pop(); a = cur.x; if(cur.dis > dist) { dist = cur.dis; source = a; } int i; for(i=head[a]; i!=-1; i=edge[i].nex) { b = edge[i].v; if(vis[b]==0) { vis[b] = 1; nex.x = b; nex.dis = cur.dis + edge[i].w; qu.push(nex); } } } return source; } int main() { int n,u,v; ll w; while(~scanf("%d",&n)) { cnt = 0; memset(head,-1,sizeof(head)); for(int i = 1; i < n; i++) { scanf("%d%d%lld",&u,&v,&w); addEdge(u,v,w); } int newStart = bfs(1); //可以选图中任意点为起点,在此我选择1 bfs(newStart); //从距1最远的点newStart开始找离newStart最远的点。 ll ans; //可以按照等差数列公式直接求解答案。 if(dist%2==0) { ans = dist/2; ans = ans*(dist+1); } else { ans = (dist+1)/2; ans = ans*dist; } ans += dist*10; printf("%lld\n",ans); } return 0; }
0.0分
10 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复