分析题目要求:
首相明确有两种目的地,一种是回到原点,一种是到达一个没有到过的地方;
路径中经过的点不能够有重复的点;
根据题目给出的数据可以发现,1-2-3-4 和 4-3-2-1是两条不同的路径。
解体思路:
1.使用vis[]数组记录经过的点;
2.使用DFS寻找可能的路径,因为路径的长度是4,那么当寻找路径上的前3个点的时候,如果可以从前一个点走到当前的点,并且当前的点没有走过,那么将当前的点设置为路径当中的点。
3.寻找路径第四个点的时候,有两种可能的情况,一种是可以到达的第四个点是之前没有走过的点,方案数量加一,另外一的情况是可以到达的第四个点是第一个点(走回到了起点),方案数量加一。
注意事项:
1.使用vector创建一个邻接表,如果使用邻接矩阵,容易时间超限。
参考代码:
#include<iostream> #include<vector> #include<cstring> #include<algorithm> using namespace std; int M,N,u,v,ans; const int maxn=10010; vector<int>G[maxn]; bool used[maxn]; //u表示上一个顶点,dep表示当前寻找第dep+1个结点,s表示起点; void DFS(int u,int dep,int s){ if(dep==3){ for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(!used[v] || v==s) ans++; } return ; } else{ for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(!used[v]){ used[v]=true; DFS(v,dep+1,s); used[v]=false; } } } return ; } int main(void){ cin>>N>>M; for(int i=1;i<=M;i++){ cin>>u>>v; G[u].push_back(v); G[v].push_back(u); } memset(used,0,sizeof(used)); for(int i=1;i<=N;i++){ used[i]=true; DFS(i,1,i); used[i]=false; } cout<<ans; return 0; }
0.0分
14 人评分
简单的a+b (C语言代码)浏览:765 |
【回文数(二)】 (C语言代码)浏览:940 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:674 |
字符串比较 (C语言代码)答案错误????浏览:641 |
程序员的表白 (C语言代码)浏览:706 |
简单的for循环浏览:1498 |
WU-陶陶摘苹果2 (C++代码)浏览:1018 |
文科生的悲哀 (C语言代码)浏览:1538 |
sizeof的大作用 (C语言代码)浏览:1593 |
A+B for Input-Output Practice (III) (C语言代码)浏览:594 |
海洋之心 2020-04-13 01:51:29 |
阔以阔以,这个比喻倒是不错