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
贴个代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n", maxl-1); 86 } 87 88 89 return 0; 90 }