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
AC × 32
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