CSU-ACM2017暑期训练4-dfs D
来源:互联网 发布:知乎 永不瞑目 编辑:程序博客网 时间:2024/05/17 08:01
题目:
有一棵由N个结点构成的树,每一条边上都有其对应的权值。现在给定起点,求从该点出发的一条路径(至少有一条边)使得这条路径上的权值之和最大,并输出这个最大值。
Input 第一行一个正整数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的双向边。
Output 每组数据输出一行,即所找到路径的最大权值(格式参见样例)。
Sample Input 23 11 2 101 3 55 51 5 704 3 1005 3 -102 5 60
Sample Output Case #1: 10Case #2: 90
题意: 求无向图中给定起点的最大路径(也就是从这个起点出发能走到的最远距离) 思路:vector存邻接点的id和路的权值,然后深搜,用一个数组dis[]记录所有点到起点的距离。代码:
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>using namespace std;typedef long long ll;const double PI = acos(-1.0);const double eps = 1e-6;const int INF = 1000000000;const int maxn = 111111;struct ED{ int v;//中点 int w;//权值};int t,n,s;int x,y,z;int dis[maxn];int book[maxn];ED temp;vector<ED>E[maxn];void dfs(int st){ book[st]=1; for(int i=0;i<E[st].size();i++) { if(book[E[st][i].v]==0) { dis[E[st][i].v]=dis[st]+E[st][i].w; dfs(E[st][i].v); } }}int main(){ scanf("%d",&t); int no=0;while(t--) { scanf("%d%d",&n,&s); memset(book,0,sizeof(book)); memset(dis,0,sizeof(dis)); for(int i=1;i<=n;i++) E[i].clear(); for(int i=0;i<n-1;i++) { scanf("%d%d%d",&x,&y,&z); temp.w=z; temp.v=y; E[x].push_back(temp); temp.v=x; E[y].push_back(temp); } dfs(s); int ans=-INF; for(int i=1;i<=n;i++) { ans=max(dis[i],ans); } printf("Case #%d: %d\n",++no,ans); } return 0;}
有一棵由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
题意: 求无向图中给定起点的最大路径(也就是从这个起点出发能走到的最远距离)
思路:vector存邻接点的id和路的权值,然后深搜,用一个数组dis[]记录所有点到起点的距离。
代码:
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>using namespace std;typedef long long ll;const double PI = acos(-1.0);const double eps = 1e-6;const int INF = 1000000000;const int maxn = 111111;struct ED{ int v;//中点 int w;//权值};int t,n,s;int x,y,z;int dis[maxn];int book[maxn];ED temp;vector<ED>E[maxn];void dfs(int st){ book[st]=1; for(int i=0;i<E[st].size();i++) { if(book[E[st][i].v]==0) { dis[E[st][i].v]=dis[st]+E[st][i].w; dfs(E[st][i].v); } }}int main(){ scanf("%d",&t); int no=0;while(t--) { scanf("%d%d",&n,&s); memset(book,0,sizeof(book)); memset(dis,0,sizeof(dis)); for(int i=1;i<=n;i++) E[i].clear(); for(int i=0;i<n-1;i++) { scanf("%d%d%d",&x,&y,&z); temp.w=z; temp.v=y; E[x].push_back(temp); temp.v=x; E[y].push_back(temp); } dfs(s); int ans=-INF; for(int i=1;i<=n;i++) { ans=max(dis[i],ans); } printf("Case #%d: %d\n",++no,ans); } return 0;}
阅读全文
0 0
- CSU-ACM2017暑期训练4-dfs D
- CSU-ACM2017暑期训练4-dfs E
- CSU-ACM2017暑期训练4-dfs F
- CSU-ACM2017暑期训练4-dfs G
- 后序遍历--CSU-ACM2017暑期训练4-dfs
- CSU-ACM2017暑期训练4-dfs H- Square HDU
- CSU-ACM2017暑期训练5-三分 D
- CSU-ACM2017暑期训练12-KMP D
- CSU-ACM2017暑期训练8-动态规划初步 D
- CSU-ACM2017暑期训练14-最短路 D
- CSU-ACM2017暑期训练16-树状数组 D
- CSU-ACM2017暑期训练3 J
- CSU-ACM2017暑期训练5-三分 E
- CSU-ACM2017暑期训练6-bfs C
- CSU-ACM2017暑期训练6-bfs I
- CSU-ACM2017暑期训练6-bfs H
- CSU-ACM2017暑期训练6-bfs G
- CSU-ACM2017暑期训练5-三分 A
- 笨方法学Python 习题 23: 读代码
- POJ 1190 生日蛋糕(深搜+剪枝)
- c++实现单例模式
- resultType和resultMap总结
- hdu--6038--Function
- CSU-ACM2017暑期训练4-dfs D
- 将二叉搜索树转换成一个排序的双向链表
- poj1655—Balancing Act(树的重心)
- 集合框架的基础知识
- HTML5 本地数据库
- 【华为机试】找出字符串中第一个只出现一次的
- 常用工具类作业(还没学全 只是一部分)
- ubuntu-用xshell无密码连接虚拟机报错
- C++实现一个线程安全且高效单例类。(懒汉与饿汉)