题意:求图的最长路径,这里的最长路径是指每条边只能经过一次,但是点可以经过很多次的那种。
题解:两遍dfs
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Edge
{
int a,b,next;
}edge[100];
int head[100],nc,ans,pos;
bool mark[100];
void add(int a,int b)
{
edge[nc].a=a;edge[nc].b=b;edge[nc].next=head[a];head[a]=nc++;
}
void dfs(int now,int len)
{
if(len>ans)
ans=len,pos=now;
for(int i=head[now];i!=-1;i=edge[i].next)
{
if(mark[i>>1])
continue;
int t=i>>1;
mark[t]=true;
dfs(edge[i].b,len+1);
mark[t]=false;
}
}
int main()
{
int n,m,a,b;
while(scanf("%d%d",&n,&m),n||m)
{
nc=ans=pos=0;
memset(head,-1,sizeof(head));
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
memset(mark,false,sizeof(mark));
dfs(0,0);
dfs(pos,0);
printf("%d\n",ans);
}
return 0;
}

本文介绍了一种求解图中每条边仅能经过一次的最长路径算法,通过两次深度优先搜索(DFS)实现,适用于寻找特定类型的最长路径问题。
553

被折叠的 条评论
为什么被折叠?



