CSU - 1960 單源最大權路徑

有一棵由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
2
3 1
1 2 10
1 3 5
5 5
1 5 70
4 3 100
5 3 -10
2 5 60
Sample Output
Case #1: 10
Case #2: 90

Hint

解題思路:這是一棵樹,按照題目中所說的dfs遍歷,也就可以得出來了


代碼:

#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
#define maxx 100005
#define INF 0x3f3f3f3f
struct 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;
    }
}



發佈了79 篇原創文章 · 獲贊 1 · 訪問量 8919
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章