CSU
来源:互联网 发布:mac休眠后继续下载吗 编辑:程序博客网 时间:2024/05/18 02:19
有一棵由N个结点构成的树,每一条边上都有其对应的权值。现在给定起点,求从该点出发的一条路径(至少有一条边)使得这条路径上的权值之和最大,并输出这个最大值。
第一行一个正整数T,代表数据组数。每组数据第一行两个正整数n(2<=n<=10^5),s(1<=s<=n),分别表示树结点数目以及给定的起点,点的编号从1至N。接下来M行,每行三个整数x,y,z,(1<=x,y<=n,|z|<=1000),代表编号为x和y的点之间有一条权值为z的双向边。
每组数据输出一行,即所找到路径的最大权值(格式参见样例)。
23 11 2 101 3 55 51 5 704 3 1005 3 -102 5 60
Case #1: 10Case #2: 90
Hint
解题思路:这是一棵树,按照题目中所说的dfs遍历,也就可以得出来了
代码:
#include<iostream>#include<vector>#include<cstring>#include<cmath>using namespace std;#define maxx 100005#define INF 0x3f3f3f3fstruct edge{ int p; int value; edge(int aa,int bb) { p = aa; value = bb; }};vector<edge> E[maxx];int dist[maxx];bool vis[maxx];int dfs(int h){ vis[h] = true; for(int i = 0;i<E[h].size();i++) { int v = E[h][i].p; int w = E[h][i].value; if(vis[v]) continue; dist[v] = dist[h]+w; dfs(v); }}int main(){ int pointnum; int be; int t; cin>>t; int ca = 0; while(t--) { ca++; memset(dist,-INF,sizeof(dist)); memset(vis,false,sizeof(vis)); cin>>pointnum>>be; for(int i = 0;i<=pointnum;i++) E[i].clear(); int a,b,c; for(int i = 0;i<pointnum-1;i++) { cin>>a>>b>>c; E[a].push_back(edge(b,c)); E[b].push_back(edge(a,c)); } dist[be] = 0; dfs(be); int ans = -INF; for(int i = 1;i<=pointnum;i++) ans = max(ans,dist[i]); cout<<"Case #"<<ca<<": "<<ans<<endl; }}
阅读全文
0 0
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- 电商推荐算法应用
- 【面经笔记】红云融通电话二面
- ImgNet Top-5
- 206. Reverse Linked List
- 第K大的数
- CSU
- 秒杀99%的海量数据处理面试题(一)
- java 自己写的一个自动分析对象的mysql数据库操作工具
- 洛谷 P3413 SAC#1
- 显示eclipse中Problem窗口的方法
- db,dbm,w,dbw,mw的换算关系
- uva 11426 欧拉函数
- Oracle中增加表空间大小的四种方法
- 框架学习之struts2-03标签、OGNL表达式