11개의 댓글이 있습니다.
-
-
chrak81 -
중간에 풀었던 과정의 코드 추가했습니다.
원래의 BFS코드라면 2번째 처럼 될 텐데, 메모리 초과가 되더라구요..
visited 변수를 없애고 graph에 0 = 방문불가, 1 = 미방문,
2 = 방문으로 풀었는데도 여전히 마찬가지였습니다.그래서 3번째 코드처럼 링크드 리스트로 그래프 데이터를 변환해서
돌려주었는데도 시간초과가 걸리는 문제가 있었습니다.
BFS를 시작점에서 부터 한번만 검사를 하면 시작점에 관련된 것들만
그룹지어지는 문제도 있었구요..그래서 마지막처럼 미리 queue에 데이터를 전부 대입해서 관련된 데이터
를 지워나가는 방식으로 변경해 보았습니다. 링크드 리스트의 erase의
비용이 크지 않다면 오히려 위에 소스들보다는 효율적이지 않을까 생각을
해서 말이죠...지금 보니까 visit하는 부분을 한꺼번에 묶어서 처리해야 될 듯 싶긴 한데
맞는지요?
11년 전 link
-
-
-
chrak81 -
그,, 그렇죠. 초과하는게 당연한건데 0이 하나 빠졌다고 하셔서 아차해서 이상한 답변을 했었네요.
마지막 시도했던 소스 추가했습니다.
마지막 소스도 결국 O(E 2 )라 크게 개선되지 못한 채 시간초과네요...for문을 돌린 이유가 인접한 데이터를 찾기 위함인데, (1 3)(7 4)(2 4)(5 6)(9 10)(8 6)에서
(1 3)이 다른 숫자와 인접해 있는가를 찾기 위해서는 결국 전체 루프를 돌 수 밖에 없다고
생각되어서였거든요..
BFS가 잘못된 것 같다는 말씀은 여기에 루프를 돌리지 않고 처리할 수 있는 방법이 있다는 말씀이시죠?
11년 전 link
-
-
-
Being -
http://en.wikipedia.org/wiki/Breadth-first_search 항목 등을 참고하시기 바랍니다.
11년 전 link
-
-
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.

chrak81
1
~~~ c++
#include
#include
#include
//#define CHECK
#ifdef CHECK
#include "windows.h"
#endif
using namespace std;
typedef set SSet;
typedef struct SNode_
{
SNode_()
{
}
} SNode;
typedef vector SVector; SResult;
typedef vector
int Recursive(SNode& node, SVector& data, int index, SSet& sum)
{
for (int i = index + 1; i < data.size(); ++i)
{
if (node.Find(data[i]))
{
node.InsertData(sum);
data[i].InsertData(sum);
}
int Execute(int n, int m, SVector& data)
{
}
int main()
{
int testCase;
int n, m;
int x, y;
SResult re;
#ifdef CHECK
#endif
#ifdef CHECK
#endif
}
~~~
2
~~~ c++
#include
#include
using namespace std;
char graph[10001][10001] = {{0,},};
char visited[10001][10001] = {{0,},};
int BFS(int x, int y, int n)
{
int maxSize = 0;
}
int main()
{
int testCase;
int n, m;
int x, y;
cin >> testCase;
}
~~~
3
~~~ c++
#include
#include
#include
#include
using namespace std;
struct SNode
{
SNode(int x_, int y_)
: x(x_), y(y_)
{
v = 0;
};
typedef list LIST;
int BFS(LIST& graph, LIST::iterator& it)
{
int maxSize = 0;
}
int main()
{
int testCase;
int n, m;
int x, y;
LIST graph;
}
~~~
4
~~~ c++
#include
#include
using namespace std;
struct SNode
{
SNode(int x_, int y_)
: x(x_), y(y_)
{
}
int x, y;
};
typedef list LIST;
int BFS(LIST& graph, int m)
{
LIST::iterator it = graph.begin();
int v = (*it).x;
int maxSize = 2;
int cnt = 0;
}
int main()
{
int testCase;
int n, m;
int x, y;
LIST graph;
}
~~~
5
~~~ c++
#include
#include
using namespace std;
int graph[100001][2] = {{0,},};
int queue[100001][2] = {{0,},};
char visited[100000] = {0,};
int BFS(int m)
{
int f = 0, r = 0;
}
int main()
{
int testCase;
int n, m;
int x, y;
cin >> testCase;
}
원래 첫번째 소스대로 재귀적으로 매칭되는 데이터를 찾아가는 방
식을 쓰다가 계속 시간초과가 나서 두번째 소스로 변경했습니다.
배열로 했었고, queue도 있는 형태로 작성하다가 배열로 하면
메모리 초과, queue를 대입하는 시간조차 부족해서 시간초과..
그래서 list를 이용해서 visit 했던 노드는 삭제하는 방식으로
최종적으로 4번 소스같이 변경했는데도 여전히 시간 초과네요.
혹시 이거 푸신 분들은 어떤 식으로 푸셨나요?
제가 개념 자체를 잘못 이해하고 있는 걸까요? ㅠ
11년 전