求无向图的简单最大环
思想很简单,就是有dfs遍历图并且用一个数组记录所走的长度。当来到一个点是已经访问过的,则肯定形成一个环,更新环的长度,直到所有点访问完为止。
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define _Clr(x, y) memset(x, y, sizeof(x)) 5 #define INF 0x3f3f3f3f 6 #define N 5000 7 using namespace std; 8 9 int head[N], tot; 10 struct Edge 11 { 12 int to, next; 13 Edge(){} 14 Edge(int a, int b):to(b), next(head[a]){} 15 }edge[N<<1]; 16 int n, ans; 17 18 void Init() 19 { 20 tot = 0; 21 _Clr(head, -1); 22 } 23 24 void Add_edge(int a, int b) 25 { 26 edge[tot] = Edge(a, b); 27 head[a] = tot++; 28 } 29 bool used[N]; 30 int dist[N]; 31 void dfs(int u, int len) 32 { 33 used[u] = 1; 34 dist[u] = len; 35 for(int i=head[u]; i!=-1; i=edge[i].next) 36 { 37 int v = edge[i].to; 38 if(used[v]) 39 ans = max(ans, dist[v]-dist[u]+1); 40 else 41 dfs(v, len+1); 42 } 43 } 44 45 int main() 46 { 47 freopen("date.in","r", stdin); 48 int T, m, a, b; 49 scanf("%d", &T); 50 while(T--) 51 { 52 scanf("%d%d", &n, &m); 53 Init(); 54 while(m--) 55 { 56 scanf("%d%d", &a, &b); 57 Add_edge(a, b); 58 Add_edge(b, a); 59 } 60 ans = 0; 61 _Clr(used, 0); 62 _Clr(dist, 0); 63 for(int i=1; i<=n; i++) 64 if(!used[i]) dfs(i, 1); 65 if(ans<=2) 66 puts("0"); 67 else printf("%d\n", ans); 68 } 69 return 0; 70 }