성가신 슬라이드쇼 - 토폴로지 정렬

여기에 이미지 설명 삽입

성가신 슬라이드쇼

문제 설명

리 교수는 오늘 오후에 매우 중요한 연설을 했습니다. 불행히도 그는 매우 깔끔한 사람이 아니며 프레젠테이션에 사용하는 슬라이드를 무작위로 쌓습니다. 따라서 그는 연설 전에 이 슬라이드를 정리해야 했습니다. 유능한 학자로서 그는 그것을 가능한 한 쉽게 만들고 싶었습니다. 상황은 이렇습니다. 교수는 이 연설을 위해 총 n개의 슬라이드(n≤26)를 사용할 것이며, 이 n개의 슬라이드는 사용 순서에 따라 1, 2, ..., n으로 번호가 매겨졌습니다. 그 연설. 슬라이드가 투명하기 때문에 각 번호가 어느 슬라이드에 해당하는지 한번에 알 수 없습니다.

이제 대문자 A, B, C, . . . 슬라이드에 번호를 다시 매기면 그림과 같이 A라는 슬라이드가 4번째라는 것을 금방 알 수 있고, 빼내고 나면 C라는 슬라이드가 2번째라는 것을 확인할 수 있고, . . .

귀하의 임무는 슬라이드의 숫자와 문자를 일치시키는 프로그램을 작성하는 것입니다. 분명히 이 대응은 고유해야 합니다. 여러 대응이 있거나 일부 숫자와 문자가 일치하지 않으면 대응이 불가능하다고 말했습니다.

입력 및 출력 형식

입력 형식

파일의 첫 번째 줄에는 n개의 슬라이드가 있음을 나타내는 숫자 n이 하나만 있고, 다음 n줄에는 슬라이드의 좌표인 4개의 정수 Xmin, Xmax, Ymin, Ymax(정수는 공백으로 구분됨)가 포함됩니다. n개의 슬라이드는 입력 파일에 나타나는 순서대로 앞에서 뒤로 A, B, C로 번호가 매겨집니다. . . 다음 n줄은 차례로 n개의 숫자의 좌표 X와 Y입니다.분명히 슬라이드 외부에는 숫자가 없을 것입니다.

출력 형식

일치할 수 있는 경우 출력 파일에 n개의 줄이 포함되어야 하고 각 줄은 문자와 숫자이며 각 줄은 문자의 오름차순으로 정렬됩니다. 출력 문자는 대문자로 대문자여야 합니다. , 대응이 이루어지지 않으면 파일에서 첫 번째 행의 맨 위 셀에 None을 출력하십시오. 줄의 시작과 끝에 여분의 공백이 없습니다.

입력 및 출력 샘플

입력 샘플:

입력 예 1:

4
6 22 10 20
4 18 6 16
8 20 2 18
10 24 4 8
9 15
19 17
11 7
21 11

입력 예 2:

2
0 2 0 2
0 2 0  2
1 1
1 1

샘플 출력:

출력 샘플 1:

A4
B1
C2
D3

출력 샘플 2:

None

올바른 방법

토폴로지 정렬

토폴로지 정렬은 방향성 비순환 그래프(DAG)를 정렬하기 위한 알고리즘입니다. 토폴로지 정렬에서 그래프의 노드는 작업 또는 이벤트를 나타내고 방향이 있는 가장자리는 작업 간의 종속성을 나타냅니다. 위상 정렬의 목표는 모든 작업이 종속성 순서로 실행되도록 정렬 방법을 찾는 것입니다.

위상 정렬의 단계는 다음과 같습니다.

  1. 대기열을 초기화하고 차수가 0인 모든 노드를 대기열에 추가합니다.
  2. 대기열에서 노드를 가져와서 출력합니다.
  3. 이 노드의 모든 인접 노드의 진입차수를 1씩 줄입니다.
  4. 인접한 노드의 In-degree가 0이 되면 Queue에 추가합니다.
  5. 대기열이 비워질 때까지 2-4단계를 반복합니다.
  6. 토폴로지 정렬 과정은 진입차수가 0인 노드를 지속적으로 제거하여 출력하는 것으로 이해할 수 있습니다. 그래프에 주기가 있으면 주기의 절점을 순서대로 결정할 수 없기 때문에 위상 정렬을 할 수 없습니다.

토폴로지 정렬은 작업 스케줄링, 컴파일 순서, 종속성 분석 등과 같은 광범위한 응용 프로그램을 가지고 있습니다. 작업 간의 종속성을 명확히 하고 작업이 올바른 순서로 실행되도록 하며 순환 종속성 또는 무질서한 실행 순서를 방지하는 데 도움이 될 수 있습니다.

코드

#include<bits/stdc++.h>
using namespace std;
struct pian{
    
     int x1,x2,y1,y2; }p[30];
struct dian{
    
     int x,y,b; }d[30];
int n,l,z[30];
bool tu[30][30],o[30];
bool t(int x,int y,int x1,int x2,int y1,int y2)
{
    
    
	return x>=x1&&x<=x2&&y>=y1&&y<=y2;
}
int main()
{
    
    
    cin >>n;
    for (int i=1;i<=n;i++)
		cin >>p[i].x1 >>p[i].x2 >>p[i].y1 >>p[i].y2;
	for (int i=1;i<=n;i++)
	{
    
    
		cin >>d[i].x >>d[i].y;
		for (int j=1;j<=n;j++)
			if (t(d[i].x,d[i].y,p[j].x1,p[j].x2,p[j].y1,p[j].y2))
			{
    
    
				d[i].b++;
				tu[j][i]=1;
			}
	}
	for (int k=1;k<=n;k++)
		for (int tmp=0,i=1;i<=n;i++)
			if (!o[i] && d[i].b==1)
			{
    
    
				for (int j=1;j<=n;j++)
					if (tu[j][i])
					{
    
    
						tmp=j;
						break;
					}
				z[tmp]=i;
				for (int j=1;j<=n;j++)
					if (tu[tmp][j])
					{
    
    
						tu[tmp][j]=0;
						d[j].b--;
					}
				l++;
				break;
			}
	if (l!=n)
	{
    
    
		cout <<"None";
		return 0;
	}
	for (int i=1;i<=n;i++)
		cout <<char(64+i) <<z[i] <<endl;
    return 0;
}

추천

출처blog.csdn.net/DUXS11/article/details/132246658