| 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