题意:给一个图找最大环的长度
简单dfs
一个点在一个环里只会出现一次
先假设一个点为可能存在的一个环的起点 然后沿起点往下走 每个点标记一个到起点的距离
如果环存在 就可以一直下去找到 vis[a]-vis[x]+1 就是该点a到起点x的距离
存下这个距离ans 接着换一个起点找环 以此类推
如果环不存在 那么ans值一定<=2 (ans存的就是两点之间距离+1) 所以输出时判断下环是否存在
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
vector<int> s[5000];
int vis[5000],n,m,t,ans;
void dfs(int a,int d)
{
vis[a]=d;
for(int i=0;i<s[a].size();i++)
{
int x=s[a][i];
if(!vis[x]) dfs(x,d+1);
else if((vis[a]-vis[x]+1)>ans) ans=(vis[a]-vis[x]+1);
}
}
int main()
{
int a,b,i;
scanf("%d",&t);
while(t--)
{
ans=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) s[i].clear();
while(m--)
{
scanf("%d%d",&a,&b);
s[a].push_back(b);
s[b].push_back(a);
}
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
if(!vis[i]) dfs(i,1);
if(ans<=2) printf("0\n");
else printf("%d\n",ans);
}
return 0;
}