zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    973. K Closest Points to Origin
    919. Complete Binary Tree Inserter
    993. Cousins in Binary Tree
    20. Valid Parentheses
    141. Linked List Cycle
    912. Sort an Array
    各种排序方法总结
    509. Fibonacci Number
    374. Guess Number Higher or Lower
    238. Product of Array Except Self java solutions
  • 原文地址:https://www.cnblogs.com/KimKyeYu/p/3167150.html
Copyright © 2011-2022 走看看