ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1471. Расстояние в дереве

Georgy Kerensky Anyone Crash Test 3? [9] // Задача 1471. Расстояние в дереве 11 ноя 2006 01:39
Help needed!
Georgy Kerensky Re: Anyone Crash Test 3? [8] // Задача 1471. Расстояние в дереве 11 ноя 2006 02:10
What is crash?(stack overflow)
what to do?I use normal dfs and pass just two variables to it:(((
Georgy Kerensky Re: Anyone Crash Test 3? [7] // Задача 1471. Расстояние в дереве 11 ноя 2006 12:53
write dfs without recursion
Peter Ivanov Re: Anyone Crash Test 3? [6] // Задача 1471. Расстояние в дереве 21 янв 2007 23:28
or you can just add
  {$M 16777216} for Pascal
and
  #pragma comment(linker, "/STACK:16777216") for C/C++
to your recursive solution.
SOYABEAN Re: Anyone Crash Test 3? [2] // Задача 1471. Расстояние в дереве 15 мар 2009 10:58
Thank you very much, I don't know how to express my thanks to you! Thanks !!!
Freezing Sun Re: Anyone Crash Test 3? [1] // Задача 1471. Расстояние в дереве 20 апр 2009 17:33
I also got Crash on Test #3. I use BFS with a global queue, and global vectors and arrays. Does anybody know why my program crashes. Here's my code:


#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

int a[5000][5000];
int dist[5000][5000];
vector <int> v[5000];
vector <int> used;
queue <int> q;
int parent[5000];
int n,m;
int usd[5000];

void input() {
    scanf("%d",&n);
    int x,y,c;
    for (int i=0;i<n-1;i++) {
        scanf("%d%d%d",&x,&y,&c);
        a[x][y]=a[y][x]=c;
        v[x].push_back(y);
        v[y].push_back(x);
    }
}


void bld() {
    q.push(0);
    int c;
    while (!q.empty()) {
        c=q.front();
        q.pop();

//        printf("%d ",c);

        usd[c]=1;
        for (int i=0;i<used.size();i++) {
            dist[c][used[i]]=dist[used[i]][c]=a[c][parent[c]]+dist[parent[c]][used[i]];
        }

        for (int i=0;i<v[c].size();i++) {
            if (usd[v[c][i]]==0) {
//                printf("%d - %d ",v[c][i],c);
                parent[v[c][i]]=c;
                q.push(v[c][i]);
            }
        }
        used.push_back(c);
    }
}


void print() {
    scanf("%d",&m);
    int x,y;
    for (int i=0;i<m;i++) {
        scanf("%d%d",&x,&y);
        printf("%d\n",dist[x][y]);
    }
}


int main() {
    input();
    bld();

    print();
    return 0;
}
RASTA Re: Anyone Crash Test 3? // Задача 1471. Расстояние в дереве 22 апр 2009 20:36
N ≤ 50000
but your arrays only 5000
UH02 Re: Anyone Crash Test 3? [2] // Задача 1471. Расстояние в дереве 7 окт 2011 01:44
I have this problem in Java. Could you help me to fix it?
Sadia Atique Re: Anyone Crash Test 3? [1] // Задача 1471. Расстояние в дереве 7 окт 2012 01:42
My solution crashes on this test case.I used BFS+LCA to solve it,used global queue and arrays of size 50005,which should be enough,as the problem says there will be 50000 nodes.I also used randomised source for BFS,but still it's not working.Can anyone please help?
Here's my code

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
class edge{
      public:
      int to,prev,w;
      };
edge edges[100100];
int last[100100],p[50005],d[50005],L[50005],P[50005][20];
int N,num;
bool check[50005];
queue<int>Q;
void addedge(int u,int v,int w)
{
   edges[num].to=v;
   edges[num].w=w;
   edges[num].prev=last[u];
   last[u]=num;
   num++;
}
void BFS(int sc)
{
   int u,v,i;
   while(!Q.empty()) Q.pop();
   Q.push(sc);
   check[sc]=true;p[sc]=-1;d[sc]=0;L[sc]=0;
   while(!Q.empty())
   {
      u=Q.front();
      Q.pop();
      for(i=last[u]; i!=-1; i=edges[i].prev)
      {

          v=edges[i].to;
          if(!check[v])
          {
             check[v]=true;
             p[v]=u;
             d[v]=d[u]+edges[i].w;
             L[v]=L[u]+1;
             Q.push(v);
          }
      }
   }
}
int Find(int u,int v)
{
    //make u at higher level
   if(L[u]>L[v])
   {
      int temp=u;
      u=v;
      v=temp;
   }
   if(u==v) return u;

   int log,i,j;
   for(log=1; log<N; log*=2);
   //bring u and v to same level
   for(i=log; i>=0 ;i--)
     if(L[v]-L[u]>=(1<<i))
       v=P[v][i];
   if(u==v) return u;

   for(i=log; i>=0; i--){
     if(P[u][i]!=-1 && P[u][i]!=P[v][i])
      {
         u=P[u][i];v=P[v][i];
      }
   }
   return p[u];

}
int main()
{
    int m,i,j,k,a,b,c,log,x;
    //freopen("timus.txt","r",stdin);
    while(scanf("%d",&N)!=EOF)
    {
       num=0;
       for(i=0; i<N; i++) last[i]=-1;
       for(i=1; i<N; i++)
       {
          scanf("%d%d%d",&a,&b,&c);
          x=a;
          addedge(a,b,c);
          addedge(b,a,c);
       }
       for(i=0; i<N; i++) check[i]=false;
       BFS(x);
       //for(i=0; i<N; i++)  printf("%d %d %d %d\n",i,p[i],L[i],d[i]);
       memset(P,-1,sizeof(P));
       for(log=1; log<N; log*=2);
       for(i=0; i<N; i++)  P[i][0]=p[i];
       for(j=1; j<=log; j++){

         for(i=0; i<N; i++)
         {
             if(P[i][j-1]!=-1)
               P[i][j]=P[P[i][j-1]][j-1];
         }
       }

       scanf("%d",&m);
       while(m--)
       {
          scanf("%d%d",&a,&b);
          int LCA=Find(a,b);
          int dis=d[a]+d[b]-2*d[LCA];
          printf("%d\n",dis);
       }
    }

    return 0;
}

Edited by author 07.10.2012 01:43
Sadia Atique Re: Anyone Crash Test 3? // Задача 1471. Расстояние в дереве 7 окт 2012 19:41
Can anyone please help me??