Submission #1414845
Source Code Expand
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define MAX 114514
int n;
vector<int> G[MAX],nG[MAX],rG[MAX];
int ans;
int dp[2][MAX];
map<int,int> cnt1[MAX],cnt2[MAX];
int dfs1(int v,int p){
int res=0;
for(int u:G[v]){
if(u==p) continue;
int tmp=dfs1(u,v);
res=max(res,tmp);
cnt1[v][tmp]++;
}
for(int u:nG[v]){
if(u==p) continue;
int tmp=dfs1(u,v);
res=max(res,tmp);
cnt1[v][tmp]++;
}
for(int u:rG[v]){
if(u==p) continue;
dfs1(u,v);
}
ans=max(ans,res-1);
//cout<<v<<":"<<endl;for(auto p:cnt1[v]) cout<<p.first<<":"<<p.second<<endl;cout<<endl;
return dp[0][v]=res+1;
}
int dfs2(int v,int p){
int res=0;
for(int u:G[v]){
if(u==p) continue;
int tmp=dfs2(u,v);
res=max(res,tmp);
cnt2[v][tmp]++;
}
for(int u:rG[v]){
if(u==p) continue;
int tmp=dfs2(u,v);
res=max(res,tmp);
cnt2[v][tmp]++;
}
for(int u:nG[v]){
if(u==p) continue;
dfs2(u,v);
}
ans=max(ans,res-1);
//cout<<v<<";"<<endl;for(auto p:cnt2[v]) cout<<p.first<<";"<<p.second<<endl;cout<<endl;
return dp[1][v]=res+1;
}
void dfs3(int v,int p){
for(int u:G[v]){
if(u==p) continue;
dfs3(u,v);
}
for(int u:nG[v]){
if(u==p) continue;
dfs3(u,v);
}
for(int u:rG[v]){
if(u==p) continue;
dfs3(u,v);
}
for(int u:G[v]){
if(u==p) continue;
int k=dp[0][u],l=dp[1][u];
cnt1[v][k]--;
cnt2[v][l]--;
//cout<<v<<" "<<u<<":"<<k<<" "<<l<<endl;
if(cnt1[v][k]==0) cnt1[v].erase(cnt1[v].find(k));
if(cnt2[v][l]==0) cnt2[v].erase(cnt2[v].find(l));
if(!cnt1[v].empty()){
int x=(--cnt1[v].end())->first;
ans=max(ans,l+x-1);
}
if(!cnt2[v].empty()){
int y=(--cnt2[v].end())->first;
ans=max(ans,k+y-1);
}
cnt1[v][k]++;
cnt2[v][l]++;
}
for(int u:nG[v]){
if(u==p) continue;
int k=dp[0][u];
//cout<<v<<" "<<u<<":"<<k<<endl;
cnt1[v][k]--;
if(cnt1[v][k]==0) cnt1[v].erase(cnt1[v].find(k));
if(!cnt2[v].empty()){
int y=(--cnt2[v].end())->first;
ans=max(ans,k+y-1);
}
cnt1[v][k]++;
}
for(int u:rG[v]){
if(u==p) continue;
int l=dp[1][u];
//cout<<v<<" "<<u<<";"<<l<<endl;
cnt2[v][l]--;
if(cnt2[v][l]==0) cnt2[v].erase(cnt2[v].find(l));
if(!cnt1[v].empty()){
int x=(--cnt1[v].end())->first;
ans=max(ans,l+x-1);
}
cnt2[v][l]++;
}
}
signed main(){
cin>>n;
for(int i=0;i<n-1;i++){
int a,b,t;
cin>>a>>b>>t;
a--;b--;
if(t==1){
nG[a].push_back(b);
rG[b].push_back(a);
}else{
G[a].push_back(b);
G[b].push_back(a);
}
}
ans=0;
memset(dp,0,sizeof(dp));
dfs1(0,-1);
dfs2(0,-1);
//for(int i=0;i<n;i++) cout<<i<<":"<<dp[0][i]<<" "<<dp[1][i]<<endl;
dfs3(0,-1);
cout<<ans<<endl;
return 0;
}
Submission Info
Submission Time |
|
Task |
D - Longest Path |
User |
aizu_a |
Language |
C++14 (GCC 5.4.1) |
Score |
100 |
Code Size |
2973 Byte |
Status |
AC |
Exec Time |
217 ms |
Memory |
51072 KB |
Judge Result
Set Name |
All |
Score / Max Score |
100 / 100 |
Status |
|
Set Name |
Test Cases |
All |
00-sample-00.txt, 00-sample-01.txt, 10-path-00.txt, 10-path-01.txt, 10-path-02.txt, 10-path-03.txt, 10-path-04.txt, 20-path_special-00.txt, 20-path_special-01.txt, 20-path_special-02.txt, 30-star-00.txt, 30-star-01.txt, 30-star-02.txt, 30-star-03.txt, 40-binary-00.txt, 40-binary-01.txt, 40-binary-02.txt, 40-binary-03.txt, 40-binary-04.txt, 50-random-00.txt, 50-random-01.txt, 50-random-02.txt, 50-random-03.txt, 50-random-04.txt, 50-random-05.txt, 50-random-06.txt, 50-random-07.txt, 50-random-08.txt, 50-random-09.txt, 50-random-10.txt, 50-random-11.txt, 50-random-12.txt |
Case Name |
Status |
Exec Time |
Memory |
00-sample-00.txt |
AC |
8 ms |
20864 KB |
00-sample-01.txt |
AC |
8 ms |
20864 KB |
10-path-00.txt |
AC |
8 ms |
20864 KB |
10-path-01.txt |
AC |
217 ms |
51072 KB |
10-path-02.txt |
AC |
44 ms |
28544 KB |
10-path-03.txt |
AC |
62 ms |
29696 KB |
10-path-04.txt |
AC |
130 ms |
38784 KB |
20-path_special-00.txt |
AC |
192 ms |
49152 KB |
20-path_special-01.txt |
AC |
206 ms |
47872 KB |
20-path_special-02.txt |
AC |
183 ms |
42112 KB |
30-star-00.txt |
AC |
103 ms |
24696 KB |
30-star-01.txt |
AC |
11 ms |
20864 KB |
30-star-02.txt |
AC |
47 ms |
22528 KB |
30-star-03.txt |
AC |
51 ms |
22652 KB |
40-binary-00.txt |
AC |
169 ms |
31744 KB |
40-binary-01.txt |
AC |
142 ms |
30720 KB |
40-binary-02.txt |
AC |
11 ms |
21120 KB |
40-binary-03.txt |
AC |
119 ms |
29056 KB |
40-binary-04.txt |
AC |
13 ms |
21248 KB |
50-random-00.txt |
AC |
175 ms |
33152 KB |
50-random-01.txt |
AC |
53 ms |
25088 KB |
50-random-02.txt |
AC |
95 ms |
28416 KB |
50-random-03.txt |
AC |
73 ms |
26496 KB |
50-random-04.txt |
AC |
79 ms |
27136 KB |
50-random-05.txt |
AC |
168 ms |
32384 KB |
50-random-06.txt |
AC |
16 ms |
21632 KB |
50-random-07.txt |
AC |
27 ms |
22656 KB |
50-random-08.txt |
AC |
145 ms |
31744 KB |
50-random-09.txt |
AC |
105 ms |
28544 KB |
50-random-10.txt |
AC |
98 ms |
28160 KB |
50-random-11.txt |
AC |
30 ms |
22912 KB |
50-random-12.txt |
AC |
169 ms |
32384 KB |