ZOJ1221 Risk 图形的遍历

本文详细探讨了使用链表与数组在进行图形遍历时的效率差异,并通过具体代码实例展示了如何利用数组实现深度优先搜索算法。尽管数组在内存使用上可能显得浪费,但在特定情况下仍能提供高效执行。文章最后讨论了如何在给定内存限制下优化代码,以确保程序运行流畅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一开始做图形遍历的题都是用链表做的,这次用数组体会到了方便但就是有点浪费。

不过题目给的内存限制已经足够了。

View Code
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<queue>
 5 #include<iostream>
 6 
 7 using namespace std;
 8 
 9 typedef struct
10 {
11    int v;
12    int step;    
13 }Point;
14 Point P[21];
15 int visit[21], map[21][21],n;
16 int ncases, A[21], B[21];
17 
18 queue<Point>q;
19 int main()
20 {
21     int i, j, from, to,k=1;           
22     while(scanf("%d",&n) != EOF)
23     {
24        memset(map,0,sizeof(map));                                 
25            
26        while( n-- )                       
27        {                       
28           scanf("%d",&to);                       
29           map[1][to] = 1;                      
30           map[to][1] = 1;                    
31        }                      
32        for(i=2; i<=19; i++)
33        {
34           scanf("%d",&n);                                  
35           while( n-- )                    
36           {                    
37              scanf("%d",&to);                  
38              map[i][to] = 1;                 
39              map[to][i] = 1;                 
40           }                    
41        }        
42        scanf("%d",&ncases);
43        printf("Test Set #%d\n",k++);      
44        while( ncases-- )
45        {        
46           scanf("%d%d",&from,&to);
47           memset(visit,0,sizeof(visit)); 
48           for(i=1; i<=20; i++)
49           {
50             P[i].v = i;
51             P[i].step = 0;
52           }                       
53           q.push(P[from]); 
54           visit[from] = 1;
55           while(!q.empty())
56           {
57               Point u = q.front();               
58               q.pop(); 
59               if(u.v == to)
60               {
61                 printf("%d to %d: %d\n",from,to,u.step);  
62                 break;
63               }    
64               for(i=1; i<=20; i++)
65               {
66                  if(!visit[i]&&map[u.v][i])          
67                  {
68                     P[i].step = u.step+1;                                 
69                     q.push(P[i]);
70                     visit[i] = 1;
71                  }
72               }
73           }  
74           while(!q.empty())    
75             q.pop();      
76        }  
77        printf("\n"); //这里没加卡了一下
78     }
79     return 0;
80 }

转载于:https://www.cnblogs.com/cn19901203/archive/2012/05/24/2517216.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值