EOJ 1087 As long As possible

EOJ 1087 http://acm.cs.ecnu.edu.cn/problem.php?problemid=1087

POJ 1383

题意:参看了别人的思路,此题无环,即树的最长路。

   思路来自以下链接,写的很好,我就不献丑了。

   http://blog.csdn.net/nvfumayx/article/details/7540465

贴个代码:

 1 //poj 1383
 2 
 3 #include <iostream>
 4 #include <stdio.h>
 5 #include <string>
 6 #include <algorithm>
 7 #include <string.h>
 8 #include <stdlib.h>
 9 #define MAXN 1005
10 
11 using namespace std;
12 
13 int di[5] = {0, 0, -1, 1};
14 int dj[5] = {-1, 1, 0, 0};
15 
16 char g[MAXN][MAXN];
17 int m, n;
18 int v[MAXN][MAXN];
19 int maxl, mi, mj;
20 
21 int in_bound(int i, int j)
22 {
23     return (i>=0 && i<m)&&(j>=0 && j<n);
24 }
25 
26 /* 假设:A为搜索起点,L[AB]为从A出发的最长路,B为该路径的另一端点。
27         待证明的问题是 : B一定是全局最长路的一个端点。
28 */
29 void dfs(int ci, int cj)
30 {
31     //cout << ci << " " << cj << endl;
32     maxl = max(maxl, v[ci][cj]);
33     for(int k=0; k<4; k++)
34     {
35         int ni = ci + di[k],
36             nj = cj + dj[k];
37         if(in_bound(ni, nj) 
38          && !v[ni][nj] && g[ni][nj] == '.')
39         {
40             v[ni][nj] = v[ci][cj] + 1;
41             dfs(ni, nj);        
42         }
43     }    
44 }
45 
46 int main()
47 {
48     //freopen("testin.txt", "r", stdin);
49     //freopen("testout.txt", "w", stdout);
50     
51     int t;
52     cin >> t;
53     while(t--)
54     {        
55         cin >> n >> m;        
56         for(int i=0; i<m; i++)
57             scanf("%s", g[i]);
58         
59         int ans = 0;
60         memset(v, 0, sizeof(v));
61         maxl = 0;
62         for(int i=0; i<m; i++)
63             for(int j=0; j<n; j++)
64                 if(!v[i][j] && g[i][j] == '.')
65                 {
66                     v[i][j] = 1;
67                     dfs(i, j);
68                     break;
69                 }
70         for(int i=0; i<m; i++)
71             for(int j=0; j<n; j++)
72             {
73                 if(v[i][j] == maxl)
74                 {
75                     mi = i, mj = j;
76                     break;
77                 }
78             }
79         //找到B点(mi, mj)。 
80         
81         memset(v, 0, sizeof(v));
82         v[mi][mj] = 1;
83         maxl = 0;
84         dfs(mi, mj);
85         printf("%d
", maxl-1);
86     }
87     
88     
89     return 0;
90 }
View Code
原文地址:https://www.cnblogs.com/KimKyeYu/p/3167150.html