• 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
  • 相关阅读:
    Permutations II
    Add Binary
    Integer to Roman
    Roman to Integer
    Word Break
    完整记录一则Oracle 11.2.0.4单实例打PSU补丁的过程
    SQL Tuning 基础概述06
    SQL Tuning 基础概述05
    SQL Tuning 基础概述04
    SQL Tuning 基础概述03
  • 原文地址:https://www.cnblogs.com/KimKyeYu/p/3167150.html
Copyright © 2020-2023  润新知