#include <iostream>
#include <queue>
using namespace std;
typedef struct Grape { //간선
int start;
int end;
} Grape;
bool allVisited(bool* visited, int N); // 모두 방문했는지 확인하는 함수
void bfs(int start, Grape* grapeList, bool* visited, int grapeSize);
int main() {
int N, M, cnt = 0; // N은 정점 개수 M은 간선 개수 cnt는 연결요소 개수 세주는 놈
cin >> N >> M;
Grape grapeList[2 * M]; // 양방향 그래프 저장해줌
bool visited[N + 1] = {0, };
for (int i = 0; i < M; i++) { // 그래프 입력받아서 두방향 각각 저장
int a, b;
cin >> a >> b;
grapeList[2 * i].start = a;
grapeList[2 * i].end = b;
grapeList[2 * i + 1].start = b;
grapeList[2 * i + 1].end = a;
}
visited[0] = true;
while (!allVisited(visited, N)) { //모두 방문하기 전까지
for (int i = 1; i <= N; i++) { //1부터 bfs돌리기
if (!visited[i]) { //아직 bfs에서 안 돌아가서 연결 안된 애만
bfs(i, grapeList, visited, 2 * M);
cnt++;
}
}
}
cout << cnt;
return EXIT_SUCCESS;
}
bool allVisited(bool* visited, int N) {
for (int i = 1; i < N + 1; i++) {
if (!visited[i]) return false;
}
return true;
}
void bfs(int start, Grape* grapeList, bool* visited, int grapeSize) {
queue <int>q;
q.push(start);
visited[start] = true;
while (!q.empty()) {
int cur_start = q.front();
q.pop();
for (int i = 0; i < grapeSize; i++) {
if (grapeList[i].start == cur_start) {
if (!visited[grapeList[i].end]) {
q.push(grapeList[i].end);
visited[grapeList[i].end] = true;
}
}
}
}
}
https://www.acmicpc.net/problem/11724
Baekjoon Online JudgeBaekjoon Online Judgewww.acmicpc.net78%에서 틀림
나는 이제 뭐
6 5 1 2 2 5 5 1 3 4 4 6이런 입력 오면
정점 6 간선 5
1부터 검사해서
1 2
1 5가 if문 걸려가지고
2, 5가 큐에 들어가고
2, 5는 다돌려도 따로 만드는놈없으니까
1, 2, 5만 방문됨
cnt++;되고나서
bfs로 다시 3 살펴보고
3 4가 걸려서
4가 큐에 들어가고
4 6 걸려서 6 큐에 들어가고
6 visited되고 큐 비어서 bfs끝나겠지?
이런 문젠데 특이케이스
1 0
-> 1
2 1
1 2
-> 1
이런 케이스는 잘됨
도와줘!!
Graph edge라서 Grape냐? 참신하노
이름짓는건 잘 몰라ㅠㅠ edge가 맞네 앞으로 참고함
grape 귀엽다 ㅋㅋㅋㅋㅋㅋ
아씨 ㅋㅋㅋㅋㅋGraph였네 ㅋㅋㅋㅋㅋㅋ나 지금까지 어케살아왔냐 윗댓보고도 몰랐네
포도게이야
bool visited[N + 1] = {0, }; 이거 c에서도 불가능한 문법임 전역으로 빼던가 해보셈 나머진 멀쩡해보임
선생님 이게 왜 안되는 문법인가요?? 이거 {0, } 를 {0}으로 바꾸니까 바로 통과하네요 제가 알기로 {0, }이 첫 원소 넣어둔 숫자로 초기화하고 이후 원소 0으로 알아서 초기화되는걸로 아는데..
컴파일 에러라든가 문법 오류는 나진 않았늠...
c에서도 vla는 저렇게 초기화 못하고 c++은 vla 자체가 표준이 아님
오지랖같긴한데 typedef struct나 포인터 넘기는거도 c 스타일이고 vector 써보면 편할거임
아 가변길이배열이 표준이 아니라 발생하는 문제군요 선생님 진자 감사합니다
N 말고 1000 이런거면 될걸?
컴공 2학년이라 c에서 넘어와가지고 c++적응이 조금 안되네요 예.... struct대신 class 사용하나요 그러면?
컴파일 타임에서 상수취급되야한다는거니까 #define N 1000 이런건 되긴 할듯..
그게 아니라 typedef struct Grape {...} Grape; -> struct Grape {...}로 써도 나중에 타입 적을때 struct 붙일 필요 없음
아 감사합니다 진짜 여럿 배워갑니다
깔끔한 설명 굿 보니까 stack쓰는거 보면 cpp로 짜려는 것 같은데 vector써보셈 편함 ㅇㅇ
그리고 c++ pair도 검색해보셈 ㄱ
오...struct대신 vector
뭐야 특문 짤리네 vector pair int int 어찌고로 짜면 되겠네요 감잠다
글고 코드 짠 방식이 O(N*M)인데 시간제한도 아슬아슬했을듯