博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj-3895-Cycles of Lanes 简单DFS
阅读量:6787 次
发布时间:2019-06-26

本文共 1303 字,大约阅读时间需要 4 分钟。

题目链接:

题目意思:

在无向连通图中图中找一个经过边数最多的环。

解题思路:

从任意一点直接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)|1using 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;}

 

 

转载地址:http://thigo.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
Oracle数据库PL/SQL存储过程游标触发器
查看>>
JMX对weblogic的监控指标小结
查看>>
find命令详解
查看>>
directx9.0c和directxv9.0有什么差别,DirectX10.0呢
查看>>
chromium浏览器开发系列第二篇:如何编译最新chromium源码
查看>>
Root Guard - CCIE之Switching篇
查看>>
H3C路由器之NAT+端口映射实战
查看>>
Image Map的制作
查看>>
solaris 11 中SAP的启动和停止
查看>>
瀑布流布局浅析+常用插件介绍(转&改编)
查看>>
不能输入全角字符 全角转换为半角 去掉全角下的所有空格
查看>>
centOS 6.2 升级 kernel 3.2.9
查看>>
jenkins构建shell或者python脚本中含有远程登录复制会报错解决办法
查看>>
python脚本 字符串变量 强制 不转义 win地址 不转义输出
查看>>
IT自学要走远,更要走深
查看>>
文本处理命令介绍
查看>>
Java中常用的几种排序算法
查看>>
分支3-CentOS6.5下 子域授权、请求转发 的教程
查看>>
Javascript 拖拽 放大镜
查看>>