求任意图的最长路。
其实思路很简单,两次bfs即可。
首先在图中任意选择一个点,对它进行bfs扩展,找到距该点最远的点,然后再一次bfs寻找最远点,此时找到的最远距离就是最长路的大小。
Pku 1383 Labyrinth 代码:
#include <iostream>
#include <queue>
using namespace std;
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
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, 0, sizeof(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, -1, sizeof(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, 0, sizeof(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;
}