poj-3895-Cycles of Lanes 简单DFS

2014-11-23 23:11:58 · 作者: · 浏览: 6
题目意思:
在无向连通图中图中找一个经过边数最多的环。
解题思路:
从任意一点直接DFS,不用回溯,注意构成环的话至少有3条边。
因为任意一个最大环,一定可以搜到。
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
using namespace std;

int ans;
/*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
bool flag[5500];
struct Edge
{
   int v;
   struct Edge * next;
}*head[555500],edge[555500];
int n,m,cnt;
int num[4500];

void add(int a,int b)
{
   cnt++;
   edge[cnt].v=b,edge[cnt].next=head[a];
   head[a]=&edge[cnt];
}

void dfs(int cur,int hav)
{
   struct Edge *p=head[cur];
   flag[cur]=true;
   num[cur]=hav;
   while(p)
   {
      if(flag[p->
v]) //下一步已经访问过了,说明有环 { if(hav+1-num[p->v]>ans) //往回走的话就是2 ans=hav+1-num[p->v]; } else dfs(p->v,hav+1); p=p->next; } // num[cur]=0; //不需要回溯 //flag[cur]=false; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(head,NULL,sizeof(head)); memset(flag,false,sizeof(flag)); memset(num,0,sizeof(num)); cnt=0; for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); add(a,b),add(b,a); } num[1]=0; ans=0; dfs(1,0); if(ans < 3) //凑成环的话,至少要三条边 ans = 0; printf("%d\n",ans); } return 0; }