求无向图的简单最大环

以poj3895为例:

 思想很简单,就是有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
", ans);
68     }
69     return 0;
70 }
View Code
原文地址:https://www.cnblogs.com/khan724/p/4441903.html