因为路是双向的所以可以用容器来储存双向的路,a[a]={b,c}表示a点可以去往b和c两点,容器可以做到这一点。不管是dfs还是bfs用容器或者结构体储存数据都是很好的方法。
这道题独特的点是他最后一个点可以取在刚开始的那个点,所以要多加一个判断,函数中的数值start也是用来判断这种情况的。
网络寻路具体代码如下:
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
vector<int> a[10000];
int n,m;
const int N=1e4+5;
int v[N];
int ans=0;
void dfs(int u,int now,int start)
{
if(u==4)
{
ans++;
return ;
}
for(int i=0;i<a[now].size();i++)
{
if(!v[a[now][i]])
{
v[a[now][i]]=1;
dfs(u+1,a[now][i],start);
v[a[now][i]]=0;
}
if(v[a[now][i]]&&u==3&&a[now][i]==start)
{
dfs(u+1,a[now][i],start);
}
}
return ;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
for(int i=1;i<=n;i++)
{
memset(v,0,sizeof v);//需要用多个点作为初始点时需要初始化上一种情况的标记数组
v[i]=1;
dfs(1,i,i);
}
cout<<ans;
}