题目大意:图论,计算权值和最大的路径。
解题思路:遍历所有路径,计算权值和,找出最大值即可。
遍历可以通过递归或者循环。
判断当前节点是否被访问可以通过两种方法:
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;
}