Sicily 1024. Magic Island

题目大意:图论,计算权值和最大的路径。

解题思路:遍历所有路径,计算权值和,找出最大值即可。

遍历可以通过递归或者循环。

判断当前节点是否被访问可以通过两种方法:

1.定义结构体,保存visited信息

2.路径初始化。计算每个节点间的距离。

如果下一节点被访问过,到其的距离应比到当前节点的距离短。

设置到所有节点距离初始值为INF,如果下一节点距离为INF,则大于当前节点距离,表示为未被访问过。

最后算出到所有节点的最远距离取最大值。


#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

#define INF 99999999
#define N 10000

int d[N],best[N];
vector<int> v[N],e[N];
queue<int> q;

int main(){
    int n,capital;
    
    while( scanf("%d%d",&n,&capital) != EOF ){
        capital--; 
        fill(v,v+n,vector<int>());
        fill(e,e+n,vector<int>());
        
        int start,end;
        for( int i = 0; i < n - 1; ++i ){
            scanf("%d%d%d",&start, &end, &d[i]);
            start--,end--;  // num-1确保数组从0开始 
            v[start].push_back(end);
            v[end].push_back(start);
            e[start].push_back(i);
            e[end].push_back(i);
        } 
        
        fill(best,best+n,INF);
        q.push(capital);
        best[capital] = 0;
        while( !q.empty() ){
            int curr = q.front();
            for( int i = 0; i < v[curr].size(); ++i ){
                int tmpv = v[curr][i];
                int tmpe = e[curr][i];
                // 如果之前被访问,则best[curr] > best[tmpv],不满足访问条件 
                if( best[tmpv] > best[curr] + d[tmpe] ){
                    best[tmpv] = best[curr] + d[tmpe];
                    q.push(tmpv);
                }    
            }   
            q.pop(); 
        }
        
        printf("%d\n", *max_element(best,best+n));
    }
    
    return 0;    
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值