【问题标题】:Graph dfs runtime error图 dfs 运行时错误
【发布时间】:2013-08-15 09:50:01
【问题描述】:
   #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 等,直到第二项小于顶点数。

【问题讨论】:

  • 你试过在调试器中运行它吗?
  • int t,i,u,v,f,e,a,b,flag=0,flag2=0; 你把我弄丢了。如果您希望人们阅读您的代码,请为您的变量提供有意义的名称。
  • f 是顶点数,e= 边数,u=间隔,v=起点,
  • 假设 u=3,v=5 所以边将是 5,8 和 8,11 和 11,14 等,直到第二项小于顶点数
  • 全局变量是邪恶的

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


【解决方案1】:

你有一个全局变量

vector<bool> visited;

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

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

对于图中的节点,你没有把它做得足够大。


编辑

对于图表本身,您已使其足够大以容纳 f 项目:

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

visited 进行同样的操作可能会有所帮助:

visited = vector<bool> (f);

我怀疑这里还有其他问题,但这无济于事。

【讨论】:

  • 我的节点不够大??你想说什么..请说清楚
猜你喜欢
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 2010-11-18
相关资源
最近更新 更多