Problem p00777 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>
//    #include <boost/multiprecision/cpp_int.hpp>
#include <functional>
//    #define int long long
#define inf 1000000007
#define pa pair<int, int>
#define ll long long
#define pal pair<double, int>
#define ppa pair<pa, int>
#define ppap pair<int, pa>
#define ssa pair<string, int>
#define mp make_pair
#define pb push_back
#define EPS (1e-10)
#define equals(a, b) (fabs((a) - (b)) < EPS)

using namespace std;
// priority_queue<int, vector<int>, greater<int> > que;
class Point {
public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double a) { return Point(x * a, y * a); }
  Point operator/(double a) { return Point(x / a, y / a); }
  double absv() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point &p) const {
    return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
  }
};
typedef Point Vector;

struct Segment {
  Point p1, p2;
};

double hen(Vector a) {
  if (fabs(a.x) < EPS && a.y > 0)
    return acos(0);
  else if (fabs(a.x) < EPS && a.y < 0)
    return 3 * acos(0);
  else if (fabs(a.y) < EPS && a.x < 0)
    return 2 * acos(0);
  else if (fabs(a.y) < EPS && a.x > 0)
    return 0.0;
  else if (a.y > 0)
    return acos(a.x / a.absv());
  else
    return 2 * acos(0) + acos(-a.x / a.absv());
}

string itos(int i) {
  ostringstream s;
  s << i;
  return s.str();
}

int gcd(int v, int b) {
  if (v > b)
    return gcd(b, v);
  if (v == b)
    return b;
  if (b % v == 0)
    return v;
  return gcd(v, b % v);
}
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }

double distans(double x1, double y1, double x2, double y2) {
  double rr = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  return sqrt(rr);
}
/*}
int pr[100010];
//int inv[100010];

int beki(int wa,int rr){
if(rr==0) return 1ll;
if(rr==1) return wa;
if(rr%2==1) return (beki(wa,rr-1)*wa)%inf;
int zx=beki(wa,rr/2);
return (zx*zx)%inf;
}

void gya(){
pr[0]=1;
for(int i=1;i<100010;i++){
pr[i]=(pr[i-1]*i)%inf;
}
for(int i=0;i<100010;i++) inv[i]=beki(pr[i],inf-2);

}

*/

//----------------kokomade tenpure------------
int d[801][801];
vector<int> G[801];
int n;
int ar[801][810];
int q[801];

pa df(int y) {
  int sumi[810] = {0}, kyori[810];
  priority_queue<pa, vector<pa>, greater<pa>> pq;
  pq.push(mp(0, y));
  while (pq.size() > 0) {
    // cout<<"pq"<<pq.size()<<endl;
    pa z = pq.top();
    pq.pop();
    //	cout<<" ? "<<q[z.second]<<endl;
    if (q[z.second] == 0)
      continue;
    if (sumi[z.second] == 1)
      continue;
    //	cout<<" ?"<<z.second<<endl;
    kyori[z.second] = z.first;
    sumi[z.second] = 1;
    for (int i = 0; i < G[z.second].size(); i++) {

      if (q[G[z.second][i]] == 0)
        continue;
      if (sumi[G[z.second][i]] == 1)
        continue;
      pq.push(mp(z.first + d[z.second][G[z.second][i]], G[z.second][i]));
    }
  }

  int r = -1;
  int itq;
  for (int i = 1; i <= n; i++) {
    if (q[i] == 0)
      continue;
    if (r < kyori[i]) {
      r = kyori[i];
      itq = i;
    }
  }
  return mp(itq, r);
}

signed main() {
  while (1) {
    cin >> n;
    if (n == 0)
      return 0;
    for (int i = 0; i <= n; i++) {
      for (int j = 0; j <= n; j++) {
        d[i][j] = inf;
        ar[i][j] = 0;
      }
      q[i] = 0;
      d[i][i] = 0;
      G[i].clear();
    }
    int z[801];
    for (int i = 2; i <= n; i++) {
      int rt;
      cin >> rt;
      z[i] = rt;
      G[i].pb(rt);
      G[rt].pb(i);
      ar[i][rt] = 1;
      ar[rt][i] = 1;
    }
    int sum = 0;
    for (int i = 2; i <= n; i++) {
      int rt;

      cin >> rt;
      sum += rt;
      d[i][z[i]] = rt;
      d[z[i]][i] = rt;
    }
    //	cout<<sum<<endl;

    int ut = -1;
    for (int i = 1; i <= n; i++) {
      if (G[i].size() == 1)
        q[i] = 0;
      else {
        q[i] = 1;
        ut = i;
      }
    }
    int e = 0;
    int mi = 0;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) {
        if (q[i] == 0 || q[j] == 0)
          continue;
        //		e=max(e,d[i][j]);
        if (ar[i][j] == 1)
          mi += d[i][j];
      }
    mi /= 2;
    // cout<<"ut "<<ut<<endl;
    if (ut >= 0) {
      pa zz = df(ut);
      e = df(zz.first).second;
    }
    // cout<<zz.first<<endl;
    cout << sum + 2 * mi - e << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>
//    #include <boost/multiprecision/cpp_int.hpp>
#include <functional>
//    #define int long long
#define inf 1000000007
#define pa pair<int, int>
#define ll long long
#define pal pair<double, int>
#define ppa pair<pa, int>
#define ppap pair<int, pa>
#define ssa pair<string, int>
#define mp make_pair
#define pb push_back
#define EPS (1e-10)
#define equals(a, b) (fabs((a) - (b)) < EPS)

using namespace std;
// priority_queue<int, vector<int>, greater<int> > que;
class Point {
public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double a) { return Point(x * a, y * a); }
  Point operator/(double a) { return Point(x / a, y / a); }
  double absv() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point &p) const {
    return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
  }
};
typedef Point Vector;

struct Segment {
  Point p1, p2;
};

double hen(Vector a) {
  if (fabs(a.x) < EPS && a.y > 0)
    return acos(0);
  else if (fabs(a.x) < EPS && a.y < 0)
    return 3 * acos(0);
  else if (fabs(a.y) < EPS && a.x < 0)
    return 2 * acos(0);
  else if (fabs(a.y) < EPS && a.x > 0)
    return 0.0;
  else if (a.y > 0)
    return acos(a.x / a.absv());
  else
    return 2 * acos(0) + acos(-a.x / a.absv());
}

string itos(int i) {
  ostringstream s;
  s << i;
  return s.str();
}

int gcd(int v, int b) {
  if (v > b)
    return gcd(b, v);
  if (v == b)
    return b;
  if (b % v == 0)
    return v;
  return gcd(v, b % v);
}
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }

double distans(double x1, double y1, double x2, double y2) {
  double rr = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  return sqrt(rr);
}
/*}
int pr[100010];
//int inv[100010];

int beki(int wa,int rr){
if(rr==0) return 1ll;
if(rr==1) return wa;
if(rr%2==1) return (beki(wa,rr-1)*wa)%inf;
int zx=beki(wa,rr/2);
return (zx*zx)%inf;
}

void gya(){
pr[0]=1;
for(int i=1;i<100010;i++){
pr[i]=(pr[i-1]*i)%inf;
}
for(int i=0;i<100010;i++) inv[i]=beki(pr[i],inf-2);

}

*/

//----------------kokomade tenpure------------
int d[801][801];
vector<int> G[801];
int n;
int ar[801][810];
signed main() {
  while (1) {
    cin >> n;
    if (n == 0)
      return 0;
    for (int i = 0; i <= 800; i++) {
      for (int j = 0; j <= 800; j++) {
        d[i][j] = inf;
        ar[i][j] = 0;
      }
      d[i][i] = 0;
      G[i].clear();
    }
    int z[801];
    for (int i = 2; i <= n; i++) {
      int rt;
      cin >> rt;
      z[i] = rt;
      G[i].pb(rt);
      G[rt].pb(i);
      ar[i][rt] = 1;
      ar[rt][i] = 1;
    }
    int sum = 0;
    for (int i = 2; i <= n; i++) {
      int rt;

      cin >> rt;
      sum += rt;
      d[i][z[i]] = rt;
      d[z[i]][i] = rt;
    }
    //	cout<<sum<<endl;
    for (int k = 1; k <= n; k++)
      for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++) {
          d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
        }

    int q[801];
    for (int i = 1; i <= n; i++) {
      if (G[i].size() == 1)
        q[i] = 0;
      else
        q[i] = 1;
    }
    int e = 0;
    int mi = 0;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) {
        if (q[i] == 0 || q[j] == 0)
          continue;
        e = max(e, d[i][j]);
        if (ar[i][j] == 1)
          mi += d[i][j];
      }
    mi /= 2;

    cout << sum + 2 * mi - e << endl;
  }
  return 0;
}