题目描述:
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 200000 typedef struct node node_t;
typedef struct node
{
int n;
node_t *next;
}node; int vis[LEN]; //记录节点是否访问
int walk[LEN]; //记录访问的路径
node *e[LEN]; //邻接表 int n,m,res; void add_edge(int x,int y)
{
node *p;
p = (node *)malloc(sizeof(node));
p->n = y;
p->next = e[x];
e[x] = p;
return ;
} void init()
{
int i,x,y; scanf("%d%d",&n,&m);//节点数,线路条数 memset(vis,,sizeof(vis));
memset(walk,,sizeof(walk));
for (i= ; i<=n ; i++)
e[i] = NULL; for (i= ; i<m ; i++)
{
scanf("%d%d",&x,&y);
add_edge(x,y);//双向图
add_edge(y,x);
}
return ;
} void DP(int cur,int step)
{
int i;
node *p = e[cur];
walk[step] = cur; //记录路径上的节点 if (step>) //转发数必须大于两次
{
res ++;
return ;
} while (p!=NULL)
{
if (vis[p->n]==)//下一节点可访问
{
vis[p->n] = ;
DP(p->n,step+);
vis[p->n] = ;
} if (step>= && p->n==walk[])
{
DP(p->n,step+);//源地址与目的地址相同
}
p = p->next;
}
return ;
} int main(void)
{
int i;
init(); //初始化
res = ;
for (i= ; i<=n ; i++)//遍历所有节点
{
vis[i] = ;
DP(i,);
vis[i] = ;
}
printf("%d",res);
return ;
}
C解法
解题思路:
建立各节点之间的联系(邻接表)
然后遍历各节点,为满足条件,节点数必须大于2
当节点大于2后,下一节点可考虑源点或未访问的点
记录路径大于2的所有遍历路径即为题意所求