题目链接:https://vjudge.net/problem/22345/origin
--------------------------------------------------------------------
题意:求图中所有路径中最长的路径。
思路:DFS,注意:其中结点可以重复遍历,而边不可以重复遍历。所以应当在深度遍历上做一定修改,将对结点的遍历改为对边的遍历。
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; int n; int m; const int MAXN =25+5; int ed[MAXN][MAXN]; int ans=0; void dfs(int i,int ths){ for(int j =0;j<n;j++){ if(ed[i][j]==1||ed[j][i]==1){ ed[i][j]=0; ed[j][i]=0; dfs(j,ths+1); ed[i][j]=1; ed[j][i]=1; } if(ths >ans) ans=ths; } } int main(void){ while(~scanf("%d %d",&n,&m)&&(n!=0&&m!=0)){ ans =0; for(int i=0;i<MAXN;i++){ for(int j=0;j<MAXN;j++){ ed[i][j]=0; } } for(int i=0;i<m;i++){ int a,b; scanf("%d %d",&a,&b); ed[a][b]=1; ed[b][a]=1; } /*for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ printf("%d ",ed[i][j]); } printf("\n"); }*/ for(int k=0;k<n;k++){ dfs(k,0); } printf("%d\n",ans); } return 0; }