1. 程式人生 > >7-7 六度空間 DFS + BFS DFS不能做的原因 + BFS的正確AC程式碼

7-7 六度空間 DFS + BFS DFS不能做的原因 + BFS的正確AC程式碼

  一開始我興沖沖的用DFS交了一發,但是遇到很多人都遇到過的——最後一個樣例沒過。

  今天早上想了想,結果是因為DFS會把本來可以直接到達的點通過當前正在處理的直接連線的點給間接化了。
  樣例(假設不是六度空間而是二度空間,最多走兩步):
  4 4
  1 2
  1 3
  2 3
  3 4
  如果是DFS,會先通過2把3訪問,那樣到了3那一層DFS,4就不能被納入了;此時vis[3]的值又已經被置為1,無法在1的DFS中被使用——從而失去了以3為跳板到4的機會。
—————————————————————————————————————————————————————————

程式碼:
AC·BFS
 

#include <bits/stdc++.h>
using namespace std;
#define maxn 10005
#define offset 1001
int vis[maxn],N,E;
vector<int> v[maxn];
int main()
{
    int i,j,k,t;
    cin>>N>>E;
    for(i=0;i<E;++i)
    {
        scanf("%d%d",&j,&k);
        v[j].push_back(k);
        v[k].push_back(j);
    }
    for(i=1;i<=N;++i)
    {
        memset(vis,0,sizeof(vis));
        queue<int> q;
        q.push(i);
        vis[i]=1;
        int sum=1;
        int round=0,cnt,acc=1;
        while(1)
        {
            ++round;
            if(round>6) break;
            cnt=acc; acc=0;
            while(!q.empty())
            {
                t=q.front();    q.pop();
                --cnt;
                for(j=0;j<v[t].size();++j)
                {
                    int now = v[t][j] ;
                    if(!vis[ now ])
                    {
                        vis[ now ] = 1;
                        q.push( now ) ;
                        ++sum; ++acc;
                    }
                }
                if(cnt==0) break;
            }
        }
        printf("%d: %.2lf%%\n",i,(double)(sum)/N*100);
        while(!q.empty()) q.pop();
        /*for(j=1;j<=N;++j) printf("%d:%d ",j,vis[j]);
        printf("\n");*/
    }
    return 0;
}

 

DFS·失敗在最後一個樣例

#include <bits/stdc++.h>
using namespace std;
#define maxn 10005
#define offset 1001
int a[15][15];
int vis[maxn],N,E;
vector<int> v[10005];
int dfs(int s,int cs)
{
    if(cs==6) return 0;
    int i,j,k;
    vis[s]=1;
    int sum=0;
    for(i=0;i<v[s].size();++i)
    {
        if(!vis[  v[s][i] ])
        {
            ++sum;
            sum+=dfs(v[s][i],cs+1);
        }

    }
    return sum;
}
int main()
{
    int i,j,k;
    cin>>N>>E;

    for(i=0;i<E;++i)
    {
        scanf("%d%d",&j,&k);
        v[j].push_back(k);
        v[k].push_back(j);
    }
    for(i=1;i<=N;++i)
    {
        memset(vis,0,sizeof(vis));
        int ans=dfs(i,0);
        printf("%d: %.2lf%%\n",i,(double)(ans+1)/N*100);
    }
    return 0;
}