Skip to content

Instantly share code, notes, and snippets.

@IvanIsCoding
Last active July 11, 2017 15:27
Show Gist options
  • Save IvanIsCoding/6adada792195b043a8e5337ce08d8a51 to your computer and use it in GitHub Desktop.
Save IvanIsCoding/6adada792195b043a8e5337ce08d8a51 to your computer and use it in GitHub Desktop.
Seletiva IOI 2015
// Ivan Carvalho
// Caminho - Seletiva IOI - OBI 2015
#include <bits/stdc++.h>
#define MP make_pair
#define TAMANHO first
#define X second.first
#define Y second.second
#define MAXN 302
using namespace std;
typedef pair<int,int> ii;
typedef pair<int,ii> iii;
int grafo[MAXN][MAXN],visitado[MAXN][MAXN],ordem,ini=1,fim=1000000000,resp1,resp2;
int bfs(int maior){
for(int i=1;i<=ordem;i++) for(int j=1;j<=ordem;j++) visitado[i][j] = 0;
if (grafo[1][1] > maior) return -1;
queue<iii> fila;
fila.push(MP(1,MP(1,1)));
while(!fila.empty()){
iii d = fila.front();
fila.pop();
int tamanho = d.TAMANHO, x = d.X, y = d.Y;
if (visitado[x][y]) continue;
if (ordem == x && ordem == y){
return tamanho;
}
visitado[x][y] = 1;
if (x +1 <= ordem && grafo[x+1][y]<=maior) fila.push(MP(tamanho+1,MP(x+1,y)));
if (y +1 <= ordem && grafo[x][y+1]<=maior) fila.push(MP(tamanho+1,MP(x,y+1)));
if (x - 1 >= 1 && grafo[x-1][y]<=maior) fila.push(MP(tamanho+1,MP(x-1,y)));
if (y - 1 >= 1 && grafo[x][y-1]<=maior) fila.push(MP(tamanho+1,MP(x,y-1)));
}
return -1;
}
int main(){
scanf("%d",&ordem);
for(int i=1;i<=ordem;i++){
for(int j=1;j<=ordem;j++){
scanf("%d",&grafo[i][j]);
ini = min(grafo[i][j],ini);
fim = max(fim,grafo[i][j]);
}
}
while(ini <= fim){
int meio = (ini+fim)/2;
int wannabe = bfs(meio);
if (wannabe == -1){
ini = meio + 1;
}
else{
fim = meio - 1;
resp1 = wannabe;
resp2 = meio;
}
}
printf("%d %d\n",resp2,resp1);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment