fr.cpp
#include <stdio.h>
#include <string.h>
#include <vector>
#define mp make_pair
#define pb push_back
#define INF 99999999
#define REP(A,B) for(int (A) = 0; (A) < (B); A++)
using namespace std;
vector<pair<int,int> > dest[1111];
pair<int,int> from[1111];
vector<pair<int,int> > desc[1111];
bool visited[1111];
void scan(int p) {
visited[p] = true;
for(int i = 0; i < dest[p].size(); i++) {
int v = dest[p][i].first;
if(!visited[v]) {
visited[v] = true;
// desc[p].pbi(mp(v, dest[p][i].second));
from[v] = mp(p, dest[p][i].second);
scan(v);
}
}
}
int dp[1111];
int solve(int p) {
if(desc[p].size() == 0) return INF;
if(dp[p] == -1) {
int ans = 0;
for(int i = 0; i < desc[p].size(); i++) {
int tgt = desc[p][i].first;
int price = desc[p][i].second;
ans += min(price, solve(tgt));
}
dp[p] = ans;
}
return dp[p];
}
int main() {
int n, c;
while(scanf("%d %d", &n, &c) == 2) {
REP(i, n) {
dest[i].clear();
desc[i].clear();
}
REP(i, n) visited[i] = false;
memset(dp, -1, sizeof(dp));
REP(i, n-1) {
int u,v,w;
scanf("%d %d %d", &u, &v, &w);
u--; v--;
dest[u].pb(mp(v,w));
dest[v].pb(mp(u,w));
}
c--;
from[c].first = -1;
scan(c);
//REP(i, n) if(i != c) printf("from[%d]=%d\n", i, from[i].first);
for(int i = 0; i < n; i++) {
if(i == c) continue;
desc[from[i].first].pb(mp(i, from[i].second));
// printf("descs of %d: %d\n", i+1, desc[i].size());
}
//REP(i, n) printf("descs of %d: %d\n", i+1, desc[i].size());
// REP(i, n) printf("water for %d from %d, closing %d\n", i+1, from[i].first+1, from[i].second);
printf("%d\n", solve(c));
}
return 0;
}