#include <stdio.h> #include <string.h> #include <stdlib.h> int n,m; int G[30][30]; int max_,max_p,cnt; void dfs(int u) { for(int v=0;v<n;v++) { if(G[u][v]) { cnt++; G[u][v]--; G[v][u]--; if(cnt>max_p) max_p=cnt; dfs(v); G[u][v]++; G[v][u]++; } } cnt--; return; } void solve() { max_=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(G[i][j]) { max_p=0; cnt=0; dfs(i); if(max_p>max_) max_=max_p; } } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; memset(G,0,sizeof(G)); int a, b; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); G[a][b]++; G[b][a]++; } solve(); printf("%d\n",max_); } return 0; }
这不就是无向图的遍历么……走不通就往回退。小小的区别在于,因为需要计数走了几个,所以用到了一点点回溯的思想~往回退的时候将cnt - -。
哦还有因为进行多次遍历的时候,都需要用到G[][]数组,所以这个地方也应用了回溯的思想将其复原~
回溯中的走不通往回退,在这里其实没有明确体现出来。
因为数据量并不算大,而且我们也并不清楚从那个点开始遍历能得到最大的cnt,所以我们就可以把每个都当做起点都遍历一遍~找出其中最大的max_记录下来就好了。