WooKinson

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

题目描述:

 

代码如下:

 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 } 
C解法

 

解题思路:

建立各节点之间的联系(邻接表)

然后遍历各节点,为满足条件,节点数必须大于2

当节点大于2后,下一节点可考虑源点或未访问的点

记录路径大于2的所有遍历路径即为题意所求

 

posted on 2019-03-19 11:03  WooKinson  阅读(135)  评论(0编辑  收藏  举报