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? 不了解...In Reply To:RE? 不了解... Posted by:combint at 2012-03-09 01:08:44 > 可否麻烦各位大牛看一下究竟这组代码到底是在哪里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; > } 你的Edge没有清空 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator