问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=3256思路:
该题是一道简单的DFS,结果却历经了很多次RE,甚至还TLE,艾...
首先,对于paths可以用二维数组paths[MAX_N][MAX_N]来表示,虽然是很自然的事情,不过还是体现了选择合适的数据结构对于解题的帮助
然后,对于每个起点(pasture in which each cow is grazing from beginning)依次深度优先搜索,并计数
所有的搜索结束之后,清点计数,若某个pasture的计数等于cows的个数,那么就是符合条件的pasture
需要注意的一点是如何避免路径中的环路,这里使用一维数组visited来标记经过的pastures
代码:
1 void
2 init()
3 {
4 int i, j, p;
5 memset(paths, 0, sizeof(paths));
6 memset(starts, 0, sizeof(starts));
7 memset(counts, 0, sizeof(counts));
8 scanf("%d %d %d", &k, &n, &m);
9 for(i=1; i<=k; i++)
10 scanf("%d", starts+i);
11 for(i=1; i<=m; i++) {
12 scanf("%d %d", &j, &p);
13 paths[j][p] = 1;
14 }
15 }
16
17 void
18 solve(int index)
19 {
20 int i;
21 visited[index] = 1;
22 ++counts[index];
23 for(i=1; i<=n; i++)
24 if(paths[index][i] && !visited[i]) {
25 solve(i);
26 }
27 }
28
29 void
30 output()
31 {
32 int i, total=0;
33 for(i=1; i<=n; i++)
34 if(counts[i] == k)
35 ++total;
36 printf("%d\n", total);
37 }