| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
RE? 不了解...可否麻烦各位大牛看一下究竟这组代码到底是在哪里RE的? 是因为递回过深吗!? 难道记忆化搜索也无法吗...
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<utility>
#include<functional>
#include<algorithm>
#define PB push_back
#define MP make_pair
#define _F first
#define _S second
using namespace std;
typedef long long int ll;
typedef pair<int, ll> pii;
const long long int INF = 2000000000;
vector<pii> Edge[200200];
long long int DP1[200200], DP2[200200];
int root, par[200200], parS[200200];
long long int con[200200];
void init(void){
for(int i = 0; i < 200100; i++){
if(Edge[i].size()) Edge[i].clear();
DP1[i] = 0;
DP2[i] = -1;
con[i] = 0;
parS[i] = 0;
par[i] = 0;
root = 0;
}
return;
}
ll __MN(ll A, ll B){
if(A > B) return B;
return A;
}
ll __MX(ll A, ll B){
if(A > B) return A;
return B;
}
void DFS1(int now, int pre){
par[now] = pre;
if(now!=root && Edge[now].size()==1){
DP1[now] = INF;
return;
}
for(int i = 0; i < Edge[now].size(); i++){
pii nxt = Edge[now][i];
if(nxt._F == pre) continue;
parS[nxt._F] = nxt._S;
DFS1(nxt._F, now);
con[nxt._F] = __MN(DP1[nxt._F], nxt._S);
DP1[now] += con[nxt._F];
if(DP1[nxt._F] == INF) DP1[nxt._F] = 0;
}
return;
}
void DFS2(int now){
if(now == root) return;//if(now < 0) while(1);
if(now < 0) return;
if(par[now] < 0) return;
if(DP2[now] != -1) return;
if(DP2[par[now]] == -1) DFS2(par[now]);
if(Edge[now].size() == 1){
DP2[now] = __MN(Edge[now][0]._S, DP2[par[now]]);
return;
}
if(par[now]==root && Edge[par[now]].size()==1){
DP2[now] = Edge[par[now]][0]._S+DP1[now];
return;
}
DP2[now] = __MN(DP2[par[now]]-con[now], parS[now])+DP1[now];
return;
}
int main(void){
int T;
srand(time(NULL));
scanf("%d", &T);
while(T--){
int N, x, y;
long long int z;
scanf("%d", &N);
init();
for(int i = 0; i < N-1; i++){
scanf("%d%d%lld", &x, &y, &z);
Edge[x].PB(MP(y, z));
Edge[y].PB(MP(x, z));
}
root = rand()%N;
root++;
par[root] = -1;
DFS1(root, -1);
DP2[root] = DP1[root];
for(int i = 1; i <= N; i++) DFS2(i);
long long int ans = 0;
for(int i = 1; i <= N; i++)
ans = __MX(ans, DP2[i]);
printf("%lld\n", ans);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator