环游大同80天 cruisedt

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了环游大同80天 cruisedt相关的知识,希望对你有一定的参考价值。

【题目描述】:

一年一度的IOI在风景如画的大同中学举行。按照以往惯例,在激烈的比赛过程后,选手们会应邀去风景名胜区游览。今年当然也不例外。为了确定一条最佳的旅游路线,组委会请各位选手编一程序帮忙寻找。假设所有的风景点都集中在一个CR行的矩阵中,矩阵的每一元素代表风景点或者障碍物。现在你要寻找一条满足下列条件的最佳旅游路线:

●这条路线上的每一点结点必须是风景点(即不能为障碍物)

●每个风景点最多游览一次

●这条路线必须是连续的相邻风景点的序列(若风景点AB分别位于矩阵的位置(a1a2)及(b1b2),且|a1-b1|+|a2-b2|=1,则风景点AB是相邻的)

●在满足上述条件下,游览的风景点尽可能多

假设任意的两个风景点都有且仅有一条路径相连。显然,任意一个风景点都可以作为游览路线的起点或者终点。

 

【输入描述】:

第一行是两个整数CR3CR1000),表示矩阵的列数和行数。

接下来有R行,每行有C个字符,每个字符都只能是‘#’或‘.’,‘#’表示障碍物,‘.’表示风景点。行手行末无多余空格。

 

【输出描述】:

只有一行,输出最佳路线的长度。

 

【样例输入】

【样例输出】

3 3

###

#.#

###

0

【数据范围及描述】:

 

 题解说是 树上最长链(并不懂是什么东西)

两遍正反dfs就好了:

任取一个点,求它所能到达的最远点,在从最远点dfs再找最远点,就是答案!!!

 

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int maxn=1005;
 8 const int dx[]={1,-1,0,0};
 9 const int dy[]={0,0,1,-1};
10 char g[maxn][maxn];
11 int R,C;
12 bool vis[maxn][maxn];
13 bool been[maxn][maxn];
14 int X,Y,mx;
15 
16 void dfs(int x,int y,int c)
17 {
18     been[x][y]=true;
19     bool flag=false;
20     for(int i=0;i<4;i++)
21     {
22         int xx=x+dx[i];
23         int yy=y+dy[i];
24         if(xx>=1&&xx<=R&&yy>=1&&yy<=C&&!vis[xx][yy]&&g[xx][yy]==.)
25         {
26             vis[xx][yy]=true;
27             flag=true;
28             dfs(xx,yy,c+1);
29             vis[xx][yy]=false;
30         }
31     }
32     if(!flag&&mx<c) 
33     {
34         mx=c;
35         X=x,Y=y;
36     }
37     return;
38 }
39 
40 int main()
41 {
42     scanf("%d %d",&C,&R);
43     for(int i=1;i<=R;i++)
44         gets(g[i]+1);
45     memset(vis,false,sizeof(vis));
46     memset(been,false,sizeof(been));
47     int ans=-1;
48     for(int i=1;i<=R;i++)
49         for(int j=1;j<=C;j++)
50         {
51             if(!been[i][j]&&g[i][j]==.) 
52             {
53                 mx=-1;vis[i][j]=true;
54                 dfs(i,j,0);vis[i][j]=false;
55                 mx=-1;vis[X][Y]=true;
56                 dfs(X,Y,0);vis[X][Y]=false;
57                 ans=max(ans,mx);
58             }
59         }
60     printf("%d",ans);
61     return 0;
62 }
View Code

技术分享

以上是关于环游大同80天 cruisedt的主要内容,如果未能解决你的问题,请参考以下文章

[bzoj2055] 80人环游世界

bzoj205580人环游世界 有上下界费用流

bzoj2055 80人环游世界

bzoj2055: 80人环游世界(可行流)

bzoj 2055 80人环游世界

P4553 80人环游世界 上下界费用流