图dfs运行时错误

时间:2013-08-15 09:50:02

标签: html c++ algorithm graph depth-first-search

   #include<iostream>
   #include<vector>
   #include <iterator>
   #include<stdio.h>

   using namespace std;
   int t,i,u,v,f,e,a,b,flag=0,flag2=0;
   vector<bool> visited;
   int flag3=0;
   vector<vector<int> > graph;

   void dfs(int u)
   {
     visited[u]=true;
     printf("u=%d ",u);
     if(u==a)
     flag=1;
     if(u==b)
       flag2=1;
     if(flag==1&&flag2==1)
     {
       flag3=1;
     }

     for(vector<int>::iterator it=graph[u].begin();it!=graph[u].end();it++)
     {
        if(!visited[*it])
        dfs(*it);
     }
   }

   int main()
   {
     cin>>t;
     printf("%d",t);
     int j;
     for(j=0;j<t;j++)
     {
       cin>>f>>e>>a>>b;

       graph = vector<vector<int> > (f);
       for(i=1;i<=e;i++)
       {
         cin>>u>>v;
         //printf("%d %d\n",u,v);
          int old=u;
          while(1)
          {
            u=v;
            v=u+old;
            if(v>f)
              break;
            //printf("l2 u=%d v=%d\n",u,v);
            graph[u].push_back(v);
            graph[v].push_back(u);
            //printf("%d %d\n",u,v);
          }
          //printf("l1 u=%d v=%d\n",u,v);
        }
        for(i=0;i<f;i++)
            visited[i]=false;

        for(i=0;i<f;i++)
        {
          if(visited[i]==true)
          {
            cout<<visited[i]<<endl;
            continue;
          }
          flag=0;
          flag2=0;
          printf("\n");
          dfs(i);
        }
        if(flag3==1)
          printf("It is possible to move the furniture.\n");
        else
          printf("The furniture cannot be moved.\n");
        printf("%d\n",j);
      }
      return 0;
     }

这是http://www.spoj.com/problems/SCRAPER/处问题的代码。

我用dfs解决了C ++向量的问题。

对于测试用例

1
1000 2 500 777
2 3
2 1

或者我收到SIGSEVG错误的任何其他测试用例。为什么呢?

假设u=3v=5所以边缘将是5,8和8,11和11,14等,直到第二项小于顶点数。

1 个答案:

答案 0 :(得分:0)

你有一个全局变量

vector<bool> visited;

您可以在不同的地方访问,例如

if(visited[i]==true)
...
if(!visited[*it])

你没有为图表中的节点做足够大的事情。


修改

对于图表本身,您已将其设置为足以容纳f个项目:

graph = vector<vector<int> > (f);

visited做同样的事情可能会有所帮助:

visited = vector<bool> (f);

我怀疑在这里游荡还有其他问题,但这没有用。