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;}



原创粉丝点击