题目描述:
代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define LEN 200000 5 6 typedef struct node node_t; 7 typedef struct node 8 { 9 int n; 10 node_t *next; 11 }node; 12 13 int vis[LEN]; //记录节点是否访问 14 int walk[LEN]; //记录访问的路径 15 node *e[LEN]; //邻接表 16 17 int n,m,res; 18 19 void add_edge(int x,int y) 20 { 21 node *p; 22 p = (node *)malloc(sizeof(node)); 23 p->n = y; 24 p->next = e[x]; 25 e[x] = p; 26 return ; 27 } 28 29 void init() 30 { 31 int i,x,y; 32 33 scanf("%d%d",&n,&m);//节点数,线路条数 34 35 memset(vis,0,sizeof(vis)); 36 memset(walk,0,sizeof(walk)); 37 for (i=0 ; i<=n ; i++) 38 e[i] = NULL; 39 40 for (i=0 ; i<m ; i++) 41 { 42 scanf("%d%d",&x,&y); 43 add_edge(x,y);//双向图 44 add_edge(y,x); 45 } 46 return ; 47 } 48 49 void DP(int cur,int step) 50 { 51 int i; 52 node *p = e[cur]; 53 walk[step] = cur; //记录路径上的节点 54 55 if (step>2) //转发数必须大于两次 56 { 57 res ++; 58 return ; 59 } 60 61 while (p!=NULL) 62 { 63 if (vis[p->n]==0)//下一节点可访问 64 { 65 vis[p->n] = 1; 66 DP(p->n,step+1); 67 vis[p->n] = 0; 68 } 69 70 if (step>=2 && p->n==walk[0]) 71 { 72 DP(p->n,step+1);//源地址与目的地址相同 73 } 74 p = p->next; 75 } 76 return ; 77 } 78 79 int main(void) 80 { 81 int i; 82 init(); //初始化 83 res = 0; 84 for (i=1 ; i<=n ; i++)//遍历所有节点 85 { 86 vis[i] = 1; 87 DP(i,0); 88 vis[i] = 0; 89 } 90 printf("%d",res); 91 return 0; 92 }
解题思路:
建立各节点之间的联系(邻接表)
然后遍历各节点,为满足条件,节点数必须大于2
当节点大于2后,下一节点可考虑源点或未访问的点
记录路径大于2的所有遍历路径即为题意所求