0
   #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/の問題のコードです。

C++ ベクトルの問題を解決するために dfs を使用しました。

テストケースの場合

1
1000 2 500 777
2 3
2 1

または、他のテスト ケースで SIGSEVG エラーが発生します。なんで?

と仮定すると、第 2 項が頂点数より小さくなるまでu=3v=5エッジは 5,8、8,11、11,14 などになります。

4

1 に答える 1

0

グローバル変数があります

vector<bool> visited;

たとえば、さまざまな場所でアクセスする

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

グラフ内のノードに十分な大きさにする場所はどこにもありません。


編集

fグラフ自体については、アイテムを保持するのに十分な大きさにしています。

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

同様に行うとvisited役立つ場合があります:

visited = vector<bool> (f);

ここには他にも問題があると思いますが、それは役に立ちません。

于 2013-08-15T10:46:26.383 に答える