In a undirected connected graph, find a ring with the largest number of passing edges. Solution: Direct DFS from any point without backtracking. Note that there are at least three sides in the ring. Any one of the largest loops can be found. Code:
<SPAN style = "COLOR: #330033; FONT-SIZE: 18px ">#include <iostream> # include <cmath> # include <cstdio> # include <cstdlib> # include <string> # include <cstring> # include <algorithm> # include <vector> # include <map> # include <set> # include <stack> # include <list> # include <queue> # define eps 1e-6 # define INF 0x1f1f1f1f # define PI acos (-1.0) # define ll _ int64 # define lson l, m, (rt <1) # define rson m + 1, r, (rt <1) | 1 using namespace std; int ans;/* freopen ("data. in "," r ", stdin); freopen (" data. out "," w ", stdout); */bool flag [5500]; struct Edge {int v; struct Edge * next;} * head [555500], edge [555500]; int n, m, cnt; int num [4500]; void add (int a, int B) {cnt ++; edge [cnt]. v = B, edge [cnt]. next = head [a]; head [a] = & edge [cnt];} void dfs (int cur, int hav) {struct Edge * p = head [cur]; flag [cur] = true; num [cur] = hav; while (p) {if (flag [p-> v]) // you have accessed the next step, note that there is a ring {if (hav + 1-num [p-> v]> ans) // go back to 2 ans = hav + 1-num [p-> v];} else dfs (p-> v, hav + 1); p = p-> next;} // num [cur] = 0; // do not need to trace back // flag [cur] = false;} int main () {int t; scanf ("% d", & t); while (t --) {scanf ("% d", & n, & m); memset (head, NULL, sizeof (head); memset (flag, false, sizeof (flag); memset (num, 0, sizeof (num); cnt = 0; for (int I = 1; I <= m; I ++) {int a, B; scanf ("% d", & a, & B); add (a, B), add (B, );} num [1] = 0; ans = 0; dfs (); if (ans <3) // if it is a ring, it must have at least three sides ans = 0; printf ("% d \ n", ans);} return 0 ;}</SPAN>