标签:case image href article mil long imp 地方 osi
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
#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;
}
#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)
标签:case image href article mil long imp 地方 osi
原文地址:http://www.cnblogs.com/lxjshuju/p/6847005.html