Accept: 200 Submit: 476
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
Input
Output
Sample Input
Sample Output
Source
福州大學第十二屆程序設計競賽
題目大意:。。。。
解題思路:先假設最後要回到山頂,那麼總值爲所有權之和;但是因爲最後不必回到山頂,那麼要得到最小消耗,就是選擇一條最大的從根節點到葉子節點的作爲,最後下山的的路徑;求該路徑的上的權之和可以用前趨圖做;
代碼如下:
#include"iostream"
#include"cstring"
#include"cstdio"
using namespace std;
struct p{
int pre;
bool isrear;
int va;
};
p tree[100000 + 5];
int x, y, val, sum;
int max(int a, int b){
return a > b ? a : b;
}
int main(){
int n, p, t;
while(scanf("%d",&n) != EOF){
sum = 0;
for(int i = 1;i <= n-1;i ++){
scanf("%d%d%d", &x, &y, &val);
tree[y].pre = x;
tree[y].va = val;
tree[y].isrear = true;
tree[x].isrear = false;
sum += val;
}
int m = 0;
for(int i = 1;i <= n;i ++){
if(tree[i].isrear == true){
t = 0;
p = i;
while(p != 1){
t += tree[p].va;
p = tree[p].pre;
}
m = max(t, m);
}
}
printf("%d\n",sum - m);
}
}