I - 树的直径 POJ - 1383

The northern part of the Pyramid contains a very large and complicated labyrinth. The labyrinth is divided into square blocks, each of them either filled by rock, or free. There is also a little hook on the floor in the center of every free block. The ACM have found that two of the hooks must be connected by a rope that runs through the hooks in every block on the path between the connected ones. When the rope is fastened, a secret door opens. The problem is that we do not know which hooks to connect. That means also that the neccessary length of the rope is unknown. Your task is to determine the maximum length of the rope we could need for a given labyrinth.

Input

The input consists of T test cases. The number of them (T) is given on the first line of the input file. Each test case begins with a line containing two integers C and R (3 <= C,R <= 1000) indicating the number of columns and rows. Then exactly R lines follow, each containing C characters. These characters specify the labyrinth. Each of them is either a hash mark (#) or a period (.). Hash marks represent rocks, periods are free blocks. It is possible to walk between neighbouring blocks only, where neighbouring blocks are blocks sharing a common side. We cannot walk diagonally and we cannot step out of the labyrinth. 
The labyrinth is designed in such a way that there is exactly one path between any two free blocks. Consequently, if we find the proper hooks to connect, it is easy to find the right path connecting them.

Output

Your program must print exactly one line of output for each test case. The line must contain the sentence "Maximum rope length is X." where Xis the length of the longest path between any two free blocks, measured in blocks.

Sample Input

2
3 3
###
#.#
###
7 6
#######
#.#.###
#.#.###
#.#.#.#
#.....#
#######

Sample Output

Maximum rope length is 0.
Maximum rope length is 8.

Hint

Huge input, scanf is recommended. 
If you use recursion, maybe stack overflow. and now C++/c ‘s stack size is larger than G++/gcc

AC代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int c,r,dx,dy;
int ans;
char a[1005][1005];
int b[1005][1005];
int mx[4] = {0,0,1,-1};
int my[4] = {1,-1,0,0};
void dfs(int x,int y,int t)
{
    b[x][y]=1;
    if(ans<t)
    {
      dx=x;
      dy=y;
      ans=t;
    }
    int xx,yy,i;
    for(i=0;i<4;i++)
    {
        xx=x+mx[i];
        yy=y+my[i];
        if(xx>-1&&xx<r&&yy>-1&&yy<c&&!b[xx][yy]&&a[xx][yy]!=‘#‘)
          dfs(xx,yy,t+1);
    }
    b[x][y]=1;
}
int main()
{
    int t,i,j,sx,sy;
    scanf("%d",&t);
    while(t--)
    {
        int l=0;
        ans=0;
        memset(b,0,sizeof(b));
        scanf("%d %d",&c,&r);
        for(i=0;i<r;i++)
        {
            scanf("%s",a[i]);
            for(j=0;j<c&&l==0;j++)
              if(a[i][j]==‘.‘)
              {
                l=1;
                sx=i;
                sy=j;
              }
        }
        dfs(sx,sy,0);
        memset(b,0,sizeof(b));
        dfs(dx,dy,0);
        printf("Maximum rope length is %d.\n",ans);
    }
}

  

我的代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5
 6 using namespace std;
 7
 8 int r, c;
 9 char a[1005][1005];
10 int num[1005][1005];
11 int n_step, max_step, nx, ny;
12 int dx[4] = {0, 1, 0, -1};
13 int dy[4] = {1, 0, -1, 0};
14
15 int dfs(int x, int y, int step)
16 {
17     n_step = step;
18     a[x][y] = ‘#‘;
19     for(int i = -1; i <= 1; i++)
20     {
21
22         max_step = max(max_step, n_step);
23         nx = x + dx[i];
24         ny = y + dy[i];
25         if(nx > 0 && nx <= r && ny > 0 && ny <= c && a[nx][ny] == ‘.‘)
26         {
27             n_step++;
28             dfs(nx, ny, n_step);
29         }
30     }
31     return max_step;
32 }
33
34 int main()
35 {
36     int t;
37
38     scanf("%d", &t);
39     while(t--)
40     {
41         n_step = 0;
42         max_step = 0;
43         scanf("%d %d", &r, &c);
44         getchar();
45         memset(num, 0, sizeof(num));
46         for(int i = 0; i < max(r, c) + 1; i++)
47         {
48             a[0][i] = ‘#‘;
49             a[i][0] = ‘#‘;
50             a[r+1][i] = ‘#‘;
51             a[i][c+1] = ‘#‘;
52         }
53
54         //cout << r << c <<endl;
55         for(int i = 1; i <= r; i++)
56         {
57             for(int j = 1; j <= c; j++)
58             {
59                 scanf("%c", &a[i][j]);
60             }
61             getchar();
62         }
63
64         for(int i = 1; i <= r; i++)
65         {
66             for(int j = 1; j <= c; j++)
67             {
68                 if(a[i][j] == ‘.‘)
69                 {
70                     //cout << "++" << i << j << endl;
71                     int ans = dfs(i, j, 0);
72                     printf("%d\n", ans);
73                     break;
74                 }
75             }
76         }
77
78
79     }
80     return 0;
81 }

原文地址:https://www.cnblogs.com/ruruozhenhao/p/8886456.html

时间: 2024-10-07 00:53:32

I - 树的直径 POJ - 1383的相关文章

树的直径 poj 2631

树的直径:从任意一点出发,BFS找到最远的距离,然后在从该点出发BFS找到最远的距离 #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <deque> #include <vector> using namespace s

poj 1383 Labyrinth【迷宫bfs+树的直径】

Labyrinth Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 4004   Accepted: 1504 Description The northern part of the Pyramid contains a very large and complicated labyrinth. The labyrinth is divided into square blocks, each of them eithe

poj 1985 Cow Marathon 【树的直径】

题目:poj 1985 Cow Marathon 题意:给出一个树,让你求树的直径. 分析: 树的直径:树上两点之间的最大距离. 我们从任意一点出发,BFS一个最远距离,然后从这个点出发,在BFS一个最远距离,就是树的直径. AC代码: /* POJ:1985 Cow Marathon 2014/10/12/21:18 Yougth*/ #include <cstdio> #include <iostream> #include <algorithm> #include

POJ 1985 Cow Marathon(树的直径)

http://poj.org/problem?id=1985 题意: 有一个树结构, 给你树的全部边(u,v,cost), 表示u和v两点间有一条距离为cost的边. 然后问你该树上最远的两个点的距离是多少?(即树的直径) 分析: 对于树的直径问题, <<算法导论>>(22 2-7)例题有说明. 详细解法: 首先从树上随意一个点a出发, (BFS)找出到这个点距离最远的点b. 然后在从b点出发(BFS)找到距离b点最远的点c. 那么bc间的距离就是树的直径. 证明: 1.    a

POJ 1849 Two (树形dp 树的直径 两种方法)

Two Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1232   Accepted: 619 Description The city consists of intersections and streets that connect them. Heavy snow covered the city so the mayor Milan gave to the winter-service a list of st

poj:1985:Cow Marathon(求树的直径)

Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 5496   Accepted: 2685 Case Time Limit: 1000MS Description After hearing about the epidemic of obesity in the USA, Farmer John wants his cows to get more exercise, so he has com

POJ 2631 Roads in the North 树的直径

题目大意:裸的树的直径. 思路:随便用一个点跑BFS,求出这个点到所有点的距离,取距离最长的那个点,再用那个点跑BFS,最远的距离就是这棵树的直径. CODE: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 20010 using namespace std; int x,y,z;

POJ 1849 树的直径 Two

如果一个点开始遍历一棵树再回到原点那么每条边走两次. 现在是两个人从同一点出发,那么最后遍历完以后两人离得越远越好. 最后两人所处位置的路径上的边走了一次,其他边走了两次. 要使总路程最小,两人最后停在直径两端. 所以最终答案就是总权值*2 - 树的直径 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 #include <algor

BZOJ 3363 POJ 1985 Cow Marathon 树的直径

题目大意:给出一棵树.求两点间的最长距离. 思路:裸地树的直径.两次BFS,第一次随便找一个点宽搜.然后用上次宽搜时最远的点在宽搜.得到的最长距离就是树的直径. CODE: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 80010 using namespace std; int