随笔 - 97, 文章 - 22, 评论 - 81, 引用 - 0
数据加载中……

Pku 1383 Labyrinth && Zju 3172 Extend 7-day Vacation (最长路)

求任意图的最长路。

其实思路很简单,两次bfs即可。
首先在图中任意选择一个点,对它进行bfs扩展,找到距该点最远的点,然后再一次bfs寻找最远点,此时找到的最远距离就是最长路的大小。

Pku 1383 Labyrinth 代码:

#include <iostream>
#include 
<queue>
using namespace std;

int dir[4][2= {{01}{0-1}{10}{-10}};

struct point {
    
int x;
    
int y;
    
int step;
}
temp, tt;

int n, m;
point q[
1500000];
int hash[1002][1002];
char map[1002][1002];
int rear, front;

void bfs(point temp) {
    
int i;

    memset(hash, 
0sizeof(hash));
    rear 
= front = 0;

    hash[ temp.x ][ temp.y ] 
= 0;
    q[ rear 
++ ] = temp;
    
while(front < rear) {
        temp 
= q[ front++ ];

        
for(i = 0; i < 4; i++{
            tt.x 
= temp.x + dir[i][0];
            tt.y 
= temp.y + dir[i][1];
            tt.step 
= temp.step + 1;
            
if(tt.x < 0 || tt.y < 0 || tt.x >= n || tt.y >= m)
                
continue;
            
if(map[tt.x][tt.y] == '.' && !hash[ tt.x ][ tt.y ]) {
                hash[ tt.x ][ tt.y ] 
= tt.step;
                q[ rear 
++ ] = tt;
            }

        }

    }

}


int main() {

    
int t;
    
int i, j;
    scanf(
"%d"&t);

    
while(t--{
        scanf(
"%d %d"&m, &n);

        
for(i = 0; i < n; i++{
            scanf(
"%s", map[i]);
        }


        
int flag = 0;
        
for(i = 0; i < n; i++{
            
for(j = 0; j < m; j++{
                
if(map[i][j] == '.'{
                    temp.x 
= i;
                    temp.y 
= j;
                    temp.step 
= 0;
                    flag 
= 1;
                    
break;
                }

            }

            
if(flag)
                
break;
        }


        bfs(temp);
        temp.step 
= 0;

        
for(i = 0; i < n; i++{
            
for(j = 0; j < m; j++{
                
if(hash[i][j] > temp.step) {
                    temp.step 
= hash[i][j];
                    temp.x 
= i;
                    temp.y 
= j;
                }

            }

        }



        temp.step 
= 0;
        bfs(temp);
        temp.step 
= 0;
        
for(i = 0; i < n; i++{
            
for(j = 0; j < m; j++{
                
if(hash[i][j] > temp.step) {
                    temp.step 
= hash[i][j];
                    temp.x 
= i;
                    temp.y 
= j;
                }

            }

        }

        printf(
"Maximum rope length is %d.\n", temp.step);


    }

}


Zju 3172 Extend 7-day Vacation 代码:
#include <iostream>
#include 
<vector>
#include 
<queue>
using namespace std;

struct point {
    
int now;
    
int step;
}
temp, tt;

vector 
< int > vec[1001];
int hash[1001];
int n, m, x, y;
int i, j;
bool exsit[1001];
queue 
< point > q;

void bfs(point temp) {

    
int i;
    
while(!q.empty())
        q.pop();
    q.push( temp );
    hash[ temp.now ] 
= 0;
    memset(hash, 
-1sizeof(hash));

    
while(!q.empty()) {

        temp 
= q.front();
        q.pop();
        
int size = vec[ temp.now ].size();

        
for(i = 0; i < size; i++{
            
if(hash[ vec[temp.now][i] ] == -1{
                
                tt.now 
= vec[temp.now][i];
                tt.step 
= temp.step + 1;

                hash[ vec[temp.now][i] ] 
= tt.step;
                q.push( tt );
            }

        }

    }

}

int main() {
    
while(scanf("%d %d"&n, &m) != EOF) {

        memset(exsit, 
0sizeof(exsit));

        
for(i = 0; i < n; i++)
            vec[i].clear();
        
        
while(m --{
            scanf(
"%d %d"&x, &y);
            vec[x].push_back( y );
            vec[y].push_back( x );
            exsit[x] 
= exsit[y] = 1;
        }


        
for(i = 0; i < n; i++{
            
if(exsit[i] == 1)
                
break;
        }

        temp.now 
= i;
        temp.step 
= 0;
        bfs(temp);
        
for(i = 0; i < n; i++{
            
if(hash[i] > temp.step) {
                temp.step 
= hash[i];
                temp.now 
= i;
            }

        }

        temp.step 
= 0;

        bfs(temp);
    

        
for(i = 0; i < n; i++{
            
if(hash[i] > temp.step) {
                temp.step 
= hash[i];
                temp.now 
= i;
            }

        }

        
if(temp.step < 7)
            printf(
"Impossible\n");
        
else
            printf(
"%d\n", temp.step + 1);
    }

    
return 0;
}

posted on 2009-03-10 23:48 英雄哪里出来 阅读(447) 评论(0)  编辑 收藏 引用 所属分类: ACM


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理