수안보중학교 로고이미지

RSS 페이스북 공유하기 트위터 공유하기 카카오톡 공유하기 카카오스토리 공유하기 네이버밴드 공유하기 프린트하기
문제38. 바이러스 감염
작성자 컴샘 등록일 21.03.11 조회수 59



문제38

바이러스 감염

1번부터 번호가 부여된 N개의 컴퓨터가 인터넷 선으로 서로 연결되어 있다. 이때, 한 컴퓨터가 바이러스에 감염이 되면, 1분이 경과된 후에는 그 컴퓨터와 인터넷 선으로 직접 연결된 컴퓨터들도 감염된다. 이때, 1번 컴퓨터가 최초로 바이러스에 감염되고 나서, N개의 컴퓨터들이 모두 바이러스에 감염되려면 몇 분이 소요되는지를 구하는 프로그램을 작성하시오.

예를 들어, 3개의 컴퓨터들이 인터넷 선으로 <그림 1>과 같이 서로 연결되어 있는 경우 1번 컴퓨터가 바이러스에 감염되고 2분이 지나면 모든 컴퓨터들이 감염되게 된다.

<그림1 >

3개의 컴퓨터들이 인터넷 선으로 <그림 2>와 같이 서로 연결되어 있는 경우 1번 컴퓨터가 바이러스에 감염되고 1분이 지나면 모든 컴퓨터들이 감염되게 된다.

<그림2 >

6개의 컴퓨터들이 인터넷 선으로 <그림 3>과 같이 서로 연결되어 있는 경우 1번 컴퓨터가 바이러스에 감염되고 2분이 지나면 모든 컴퓨터들이 감염되게 된다.

<그림3 >

실행파일의 이름은 EE.EXE로 한다. 부분 점수는 없다.

입력 형식

입력 파일의 이름은 INPUT.TXT로 한다. 입력 파일의 첫째 줄에는 컴퓨터의 수 N이 주어진다. N은 1 이상 100 이하이고 각 컴퓨터에는 1번부터 차례대로 번호가 매겨진다. 둘째 줄에는 인터넷 선으로 직접 연결되어 있는 컴퓨터의 쌍의 개수가 주어진다. 이어서 그 수 만큼 한 줄에 한 쌍씩 인터넷 선으로 직접 연결된 컴퓨터의 번호 쌍이 주어진다. (인터넷 선으로 직접 연결된 두 컴퓨터의 번호가 빈칸 1개를 사이에 두고 한 쌍으로 주어진다.)

출력 형식

출력 파일의 이름은 OUTPUT.TXT로 한다. 1번 컴퓨터가 바이러스에 감염되었을 때, N개의 컴퓨터가 모두 바이러스에 감염되는 소요된 시간(분 단위)을 출력 파일의 첫째 줄에 출력한다.

입력과 출력의 예 1

입력 (INPUT.TXT)

3

2

1 2

2 3

출력 (OUTPUT.TXT)

2

입력과 출력의 예 2

입력 (INPUT.TXT)

3

2

1 2

1 3

출력 (OUTPUT.TXT)

1

입력과 출력의 예 3

입력 (INPUT.TXT)

6

5

1 2

1 4

2 3

4 5

4 6

출력 (OUTPUT.TXT)

2

//너비우선 탐색(BFS: Breadth First Search)

//queue1: First In First Out, 선입선출)

/*용도: 미로찾기, 프린터 출력처리,콜센터 고객 대기시간

윈도우 시스템 메시지 처리, 프로세스 관리 등에 이용 */

#include <stdio.h>

int main()

{

int n; // 컴퓨터 대수

int e; // 컴퓨터에 연결된 쌍의 수

int net[101][101]= {{0}}; //컴퓨터 최대수 100이하

int pshort[101]= {0}; // 인접행렬(연결된 컴) 가는 시간

int v[101]= {0}; // 방문여부 체크

int queue1[101]= {0}; //큐의 초기값

int head=0; // 행렬 처음을 표시

int tail=0; // 행렬의 끝을 표시

int i,j,k; //행렬

int max1=-99999; //가장 작은값으로 초기화

freopen("input.txt","r",stdin);

freopen("output.txt","w",stdout);

scanf("%d",&n); //컴퓨터 대수 불러옴

scanf("%d",&e); //컴퓨터 연결된 쌍의 수 불러옴

for(k=0; k<e; k++)

{

scanf("%d %d",&i,&j); //인접행렬(연결된컴)

net[i][j]=1; //연결된 컴퓨터 1로 표시

net[j][i]=1; //연결된 컴퓨터 1로 표시

}

queue1[tail++]=1; //tail이 가리키는 위치에 변수에 1분 초기값

v[1]=1; //1번째 컴 초기값 1

do

{

i=queue1[head++]; // queue1 head 변수 1증가(추출)

for(j=1; j<=n; j++)

{

if(net[i][j]==1 && v[j]==0)

//인접행렬(연결된컴) 그리고 방문안했으면

{

queue1[tail++]=j; // tail방에 j 저장

v[j]=1; // 방문시 1로 표시

pshort[j]=pshort[i]+1; // 연결컴 가는 시간 1분씩 증가

max1=pshort[j];

//if(max1<pshort[j]) max1=pshort[j];

/*max1 초기값인 -99999 보다 연결된 컴퓨터 1분씩 증가한 값이 크면

방문시 1분씩 증가한 값을 max1에 대입 */

}

}

}

while(head!=tail);// 끝까지 탐색

printf("%d",max1);

return 0;

}


이전글 c++ 70강좌
다음글 VC++ 로 제작한 MUSIC Player