1. 程式人生 > >[藍橋杯]PREV-13.歷屆試題_網絡尋路

[藍橋杯]PREV-13.歷屆試題_網絡尋路

include == closed none main alt walk style set

題目描述:

技術分享圖片

代碼如下:

技術分享圖片
 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的所有遍歷路徑即為題意所求

[藍橋杯]PREV-13.歷屆試題_網絡尋路