[藍橋杯]PREV-13.歷屆試題_網絡尋路
阿新 • • 發佈:2019-03-19
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]; //C解法記錄訪問的路徑 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 33scanf("%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的所有遍歷路徑即為題意所求
[藍橋杯]PREV-13.歷屆試題_網絡尋路