一开始我兴冲冲的用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;
}