05 - 트 리 8 파일 전송 (파일 전송) - 경로 압축
입력 사양: 입력 규격: 각 입력 파일 은 하나의 테스트 케이스 를 포함 합 니 다. 각 테스트 케이스 의 경우 첫 번 째 줄 에는 네트워크 에 있 는 컴퓨터 의 총 수 N (2 ≤ N ≤ 10 ^ 4) 이 포함 되 어 있 습 니 다. 네트워크 에 있 는 각 컴퓨터 는 1 과 N 사이 의 양의 정수 로 표 시 됩 니 다. 그런 다음 다음 줄 에서,the input is given in the format: 입력 파일 마다 테스트 용례 가 포함 되 어 있 습 니 다.각 테스트 용례 에 대해 첫 번 째 줄 은 N (2 ≤ ≤ 1 0 ^ 4), 한 네트워크 의 컴퓨터 총 수 를 포함한다.그리고 네트워크 의 모든 컴퓨터 는 1 에서 1 사이 의 정수 로 ñ 을 나타 낸다.그리고 다음 줄 에 다음 형식 으로 입력 하 십시오.
I c1 c2 where I stands for inputting a connection between c1 and c2; or 그 중 I 는 입력 c1 과 사이 의 연결 c2 를 표시 합 니 다.아니면
C c1 c2 where C stands for checking if it is possible to transfer files between c1 and c2; or where C 는 c1 과 사이 에 파일 c2 를 전송 할 수 있 는 지 확인 합 니 다.아니면
S where S stands for stopping this case.
출력 사양: 출력 규격: 각 C 케이스 의 경우 각각 c1 과 c2 간 에 파일 을 전송 할 수 있 거나 불가능 한 경우 한 줄 로 "예"또는 "아니오"라 는 단 어 를 인쇄 합 니 다. 각 케이스 의 끝 에 한 줄 로 인쇄 합 니 다. "네트워크 가 연결 되 어 있 습 니 다."or "There are k components."where k is the number of connected components in this network. 각 C 의 경우 c1 과 사이 에 파일 을 전송 할 수 있 거나 불가능 할 경우 한 줄 에 "예"또는 "아니오"c2 를 인쇄 합 니 다.모든 상황 이 끝 날 때 한 줄 에 '네트워크 연결 됨' 을 인쇄 합 니 다.만약 어떤 컴퓨터 사이 에 경로 가 있다 면;또는 "k 구성 요소 가 있 습 니 다."k 이 네트워크 에 연 결 된 구성 요소 의 수 는 어디 에 있 습 니까?
샘플 입력 1: 샘플 입력 1: 5 C 3 2 I 3 2 C 1 5 I 2 4 C 3 5 S
샘플 출력 1: 샘플 출력 1: 아니요 예 2 개의 구성 요소 가 있 습 니 다.
샘플 입력 2: 샘플 입력 2: 5 C 3 2 I 3 2 C 1 5 I 4 I 2 4 C 3 5 I 1 3 C 1 5 S
샘플 출력 2: 샘플 출력 2: 아니오 예 네트워크 가 연결 되 어 있 습 니 다.
사고방식 해답: 기초 조작
코드 설명:
#include
#include
#define Maxsize 10000
int Arry[Maxsize];
int FindRoot(int num);
void Connect();
void Check();
void Compute(int N);
int main()
{
int N,i = 0;
char ch;
scanf("%d",&N);//
for(i = 1; i <= N ;i++)//
Arry[i] = -1;
scanf("%c",&ch);//
while( ch != 'S')
{
switch( ch )
{
case 'C':Check();break;//
case 'I':Connect();break;//
default:break;
}
scanf("%c",&ch);
}
if(ch == 'S')
Compute(N);//
return 0;
}
int FindRoot(int num)// , : ; X ; 。
{
if( Arry[num] < 0)// ,
return num;
else
return Arry[num] = FindRoot(Arry[num]);//
}
void Connect()
{
int num1,num2,root1,root2;
scanf("%d %d",&num1,&num2);
root1 = FindRoot(num1);//
root2 = FindRoot(num2);
if(root1 != root2)//
{
if(Arry[root1] < Arry[root2])//
{
Arry[root1] += Arry[root2];
Arry[root2] = root1;
}
else
{
Arry[root2] += Arry[root1];
Arry[root1] = root2;
}
}
return ;
}
void Check()
{
int num1,num2,root1,root2;
scanf("%d %d",&num1,&num2);
root1 = FindRoot(num1);
root2 = FindRoot(num2);
if(root1 != root2)
printf("no
");
else
printf("yes
");
return ;
}
void Compute(int N)
{
int counter = 0,i = 0;
for(i = 1; i <= N ;i++)
if(Arry[i] < 0) counter++;
if(counter == 1)
printf("The network is connected.
");
else
printf("There are %d components.",counter);
return ;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.