首先我们读完题,优点懵,但是仔细读,题意就是:转发两次,一条路径上除开起始点和终点,经理两个点的所有路径,起始点和终点可以相同。
涉及存图的问题:图相关知识点
思路:很容易想到搜索(dfs),我们枚举每一个起始点,判断每一条合法路径即可,但是重要的是如何写。
重点是dfs函数。我们书写dfs函数,是要根据题意来确定参数的。要记录当前的点,那么我们用x来表示,需要记录当前总共遍历的点的数量,那么我们用cnt来记录,dfs不能搜索搜过的点,要保证是一颗向下搜索的树,所以我们用fa来表示,防止搜到它的父节点。
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' #define LL __int128 using namespace std; const int N=2e6+10,M=1e3+10,mod=998244353,INF=0x3f3f3f3f; int a[N],b[N],c[N],pre[N]; int h[N],e[N],ne[N],idx; void add(int a,int b) { e[idx]=b;ne[idx]=h[a];h[a]=idx++; } //表示答案。 int ans=0; //x,fa,cnt分别表示当前是什么节点,它的父节点,当前路径遍历的总共点数。 void dfs(int x,int fa,int cnt) { if(cnt==4) { ans++; return ; } for(int i=h[x];~i;i=ne[i]) { int j=e[i]; if(j==fa) continue; dfs(j,x,cnt+1); } } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n,m;cin>>n>>m; memset(h,-1,sizeof h);idx=0; for(int i=1;i<=m;i++) { int x,y;cin>>x>>y; add(x,y); add(y,x); } for(int i=1;i<=n;i++) { dfs(i,-1,1); } cout<<ans<<endl; return 0; }
P8605 [蓝桥杯 2013 国 AC] 网络寻路--2024蓝桥杯冲刺省一
最新推荐文章于 2024-05-23 01:00:16 发布