POJ 3895 Cycles of Lanes (dfs)
Description
other crossroad by a path composed of one or more lanes. A cycle of lanes is simple when passes through each of its crossroads exactly once.
The administration of the University would like to put on the lanes pictures of the winners of Regional Collegiate Programming Contest in such way that the pictures of winners from the same university to be on the lanes of a same simple cycle. That is why the
administration would like to assign the longest simple cycles of lanes to most successful universities. The problem is to find the longest cycles? Fortunately, it happens that each lane of the park is participating in no more than one simple cycle (see the
Figure).

Input
one of the pairs of crossroads connected by a lane.
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
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define N 5000 vector<int>q[N]; int vis[N];
int n,m;
int ans; void dfs(int a,int pos)
{
int i;
vis[a]=pos; for(i=0;i<q[a].size();i++)
{
int x=q[a][i]; if(!vis[x])
dfs(x,pos+1);
else
if(vis[a]-vis[x]+1>ans) //比如环 1 2 3 4 1 ,vis[1]=1,vis[4]=4,下一次4与
//1相连。可是已经vis[1],所以环的大小 vis[4]-vis[1]+1
ans=vis[a]-vis[x]+1;
}
} int main()
{
int i,t;
scanf("%d",&t); while(t--)
{
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
int x,y; for(i=1;i<=n;i++) //记得清空上次的数据
q[i].clear(); while(m--)
{
scanf("%d%d",&x,&y);
q[x].push_back(y); //q[x]存与x的临边
q[y].push_back(x); //同理
} ans=0;
for(i=1;i<=n;i++)
if(!vis[i]) //由于一个点就会出现一次。即使两个环有共同边,
//那么在公共边那个分叉点还是会分别进行dfs的
dfs(i,1);
//不加以下会错
if(ans<=2)//一个环须要3个点。可是我郁闷了。假设没有环的话
//怎么会有vis[x]已经标记了呢?(此时ans=0啊)难道有数据相似
// a b b a (⊙o⊙)…
ans=0;
printf("%d\n",ans);
}
return 0;
}
dfs还不是非常熟,可是有事缠身。哎以后一定好好补补dfs
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 4500 int ans,vis[N],head[N];
int n,m,num; struct stud{
int to,next;
}e[N*2]; void build(int u,int v)
{
e[num].to=v;
e[num].next=head[u];
head[u]=num;
num++;
} void dfs(int x,int pos)
{
vis[x]=pos;
int i; for(i=head[x];i!=-1;i=e[i].next)
{
if(vis[e[i].to])
ans=max(ans,vis[x]-vis[e[i].to]+1);
else
dfs(e[i].to,pos+1);
}
}
int main()
{
int i,j,v,u,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head)); num=0;
while(m--)
{
scanf("%d%d",&v,&u);
build(v,u);
build(u,v);
}
memset(vis,0,sizeof(vis));
ans=0; dfs(1,0); if(ans<3) ans=0; printf("%d\n",ans);
}
return 0;
}
POJ 3895 Cycles of Lanes (dfs)的更多相关文章
- POJ 1321-棋盘问题(DFS 递归)
POJ 1321-棋盘问题 K - DFS Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I6 ...
- poj 3895(求无向图的最大简单环)
题目链接:http://poj.org/problem?id=3895 思想很简单,就是dfs,并且用一个数组记录到该节点所走过的长度,然后如果遇到已经走过的,就说明存在环了, 更新一下ans. /* ...
- POJ 3321 Apple Tree(DFS序+线段树单点修改区间查询)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25904 Accepted: 7682 Descr ...
- POJ 1979 Red and Black dfs 难度:0
http://poj.org/problem?id=1979 #include <cstdio> #include <cstring> using namespace std; ...
- POJ 2378 Tree Cutting (DFS)
题目链接:http://poj.org/problem?id=2378 一棵树,去掉一个点剩下的每棵子树节点数不超过n/2.问有哪些这样的点,并按照顺序输出. dfs回溯即可. //#pragma c ...
- poj 1659 Frogs' Neighborhood (DFS)
http://poj.org/problem?id=1659 Frogs' Neighborhood Time Limit: 5000MS Memory Limit: 10000K Total S ...
- poj 2531 Network Saboteur( dfs )
题目:http://poj.org/problem?id=2531 题意:一个矩阵,分成两个集合,求最大的 阻碍量 改的 一位大神的代码,比较简洁 #include<stdio.h> #i ...
- poj 3009 Curling 2.0( dfs )
题目:http://poj.org/problem?id=3009 参考博客:http://www.cnblogs.com/LK1994/ #include <iostream> #inc ...
- POJ 1129 Channel Allocation 四色定理dfs
题目: http://poj.org/problem?id=1129 开始没读懂题,看discuss的做法,都是循环枚举的,很麻烦.然后我就决定dfs,调试了半天终于0ms A了. #include ...
随机推荐
- Linux一些防攻击策略
来自http://www.imooc.com/learn/344
- 用户找回密码功能JS验证邮箱通过点击下一步隐藏邮箱输入框并修改下一步按钮的ID
//这里是BaseDao /** * 获得一个对象 * @param hql * @param param * @return */ public Object get(String hql, Obj ...
- Java IO 学习(二)select/poll/epoll
如上文所说,select/poll/epoll本质上都是同步阻塞的,但是由于实现了IO多路复用,在处理聊天室这种需要处理大量长连接但是每个连接上数据事件较少的场景时,相比最原始的为每个连接新开一个线程 ...
- POI 2014 HOTELS (树形DP)
题目链接 HOTELS 依次枚举每个点,以该点为中心扩展. 每次枚举的时候,从该点的儿子依次出发,搜完一个儿子所有的点之后进行答案统计. 这里用了一个小trick. #include <bits ...
- [Python Debug] SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
I Got a SettingWithCopyWarning when I ran the following code: tmp=date[date['date'].isnull().values= ...
- Codeforces Round #324 (Div. 2) Marina and Vasya 乱搞推理
原题链接:http://codeforces.com/contest/584/problem/C 题意: 定义$f(s1,s2)$为$s1,s2$不同的字母的个数.现在让你构造一个串$s3$,使得$f ...
- Word Break - LeetCode
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- 成长笔记--解决Eclipse 变量名的自动补全问题
大家使用eclipse敲代码的时候,是不是都被这样一个问题困扰着.就是键入一个变量名的时候,会自动提示补全:在你的变量名后面加上类型的名字!这个时候,你就必须键入Esc才不会自动补全你的变量,如果你键 ...
- xamarin.android 消息推送功能--极光推送
最近在使用xamarin.android的消息推送功能,官方使用的例子是FCM方式,按照官方文档,使用FQ软件是可以成功的,但是在国内由于众所周知的原因,在国内服务并不能使用,于是查找国内各自推送平台 ...
- 最长递增子序列问题—LIS
问题:给定一组数 a0,a0,....,an-1. 求该序列的最长递增(递减)序列的长度. 最长递增子序列长度的求法有O(n^2)和O(nlogn)两种算法. 1.复杂度为O(n^2)的算法. 设L[ ...