| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 1062 | Accepted: 392 | 
Description

Input
Output
Sample Input
1 
7 8 
3 4 
1 4 
1 3 
7 1 
2 7 
7 5 
5 6 
6 2
Sample Output
4
Source
题意 求无向图中的最长环
直接dfs 依次对访问每个点编号 遇到已经访问过的点就是环了 编号相减就是环的长度
用数组存图会超内存 所以要用vector存
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 4500;
vector<int> ma[N];
int vis[N], a, b, cas, n, m, ans;
int dfs (int i, int no)
{
    vis[i] = no;
    for (int j = 0; j < ma[i].size(); ++j)
    {
        if (!vis[ma[i][j]]) dfs (ma[i][j], no + 1);
        else ans = max (ans, no - vis[ma[i][j]] + 1);
    }
}
int main()
{
    scanf ("%d", &cas);
    while (cas--)
    {
        scanf ("%d%d", &n, &m);
        for (int i = 1; i <= n; ++i) ma[i].clear();
        for (int i = 1; i <= m; ++i)
        {
            scanf ("%d%d", &a, &b);
            ma[a].push_back (b);
            ma[b].push_back (a);
        }
        ans = 0;
        memset (vis, 0, sizeof (vis));
        for (int i = 1; i <= n; ++i)
            if (!vis[i]) dfs (i, 1);
        if (ans >= 3) printf ("%d\n", ans);
        else printf ("0\n");
    }
    return 0;
}POJ 3895 Cycles of Lanes(DFS),布布扣,bubuko.com
原文:http://blog.csdn.net/iooden/article/details/38335947