Untitled

mail@pastecode.io avatar
unknown
plain_text
6 months ago
3.1 kB
4
Indexable
Never
Đi ăn cưới

Do không trốn được Uranus nên Tomoky đành ngậm ngùi nhận thiệp và hôm nay là ngày cưới của Uranus, anh dậy từ rất sớm để đến công ty đón xe đi ăn cưới.

Đường đi từ công ty đến nhà anh Uranus được biểu diễn bằng 1 đồ thị.

Có N đỉnh được nối với nhau bằng M đường một chiều, các đỉnh đánh số từ 1 đến N. Giả sử công ty là đỉnh 1, nhà anh Uranus - nơi tổ chức đám cưới là đỉnh 2.

Do biết trên xe là team SPen, một team rất giỏi STC ở SVMC nên bác lái xe vui tính muốn đố mọi người tìm đường đi để đi từ công ty đến đám cưới rồi quay về công ty sao cho đường đi thỏa mãn mà số các đỉnh khác nhau phải đi qua là tối thiểu.

Hãy viết chương trình giúp bác lái xe tìm đường đi trên.

Input

Dòng đầu tiên chứa số bộ test T. Sau đó là T bộ test, mỗi bộ test có dạng:

*Dòng 1: Số tự nhiên N và M (N<=20).

*Dòng 2..1+M: Mỗi dòng chứa 2 số nguyên khác nhau A và B (1<=A,B<=N) – biểu diễn đường đi một chiều giữa hai đỉnh A và B. Không có hai đường đi một chiều nào trùng nhau.

Output

Mỗi bộ test in trên một dòng là số đỉnh khác nhau tối thiểu phải đi qua khi đi từ đỉnh 1 đến đỉnh 2 rồi quay về 1.

Example

Input:

2

6 7

1 3

3 4

4 5

5 1

4 2

2 6

6 3

9 11

1 3

3 4

4 2

2 5

5 3

3 6

6 1

2 7

7 8

8 9

9 1

Output:

6

6



#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

int N, M;
int matrix[25][25];

int visit1[25];
int visit2[25];

int ans;

void reset() {
	for (int i = 1; i <= N; i++) {
		visit1[i] = 0;
		visit2[i] = 0;
		for (int j = i; j <= N; j++)
			matrix[i][j] = matrix[j][i] = 0;
	}
}

int findV() {
	int cnt = 0;
	for (int i = 1; i <= N; i++)
		if (visit1[i] + visit2[i] > 0)
			cnt++;
		
	return cnt;
}

void DFS1(int cur) {
	if (findV() > ans) {
		return;
	}

	if (cur == 1) {
		int num = findV();
		if (num < ans) {
			ans = num;
		}
		return;
	}

	for (int i = 1; i <= N; i++) {
		if (matrix[cur][i] == 1 && !visit1[i]) {
			visit1[i] = 1;
			DFS1(i);
			visit1[i] = 0;
		}
	}
}

void DFS2(int cur) {
	if (findV() > ans) {
		return;
	}

	if (cur == 2) {
		visit1[cur] = 1;
		DFS1(cur);
		visit1[cur] = 0;
		return;
	}

	for (int i = 1; i <= N; i++) {
		if (matrix[cur][i] == 1 && !visit2[i]) {
			visit2[i] = 1;
			DFS2(i);
			visit2[i] = 0;
		}
	}
}

int main() {
	int T;
	freopen("input.txt", "r", stdin);
	cin >> T;

	for (int tc = 1; tc <= T; tc++) {
		cin >> N >> M;
		reset();

		int a, b;
		for (int i = 0; i < M; i++) {
			cin >> a >> b;
			matrix[a][b] = 1;
		}

		ans = 100;
		visit2[1] = 1;
		DFS2(1);
		visit2[1] = 0;

		cout << ans << endl;
	}
	return 0;
}
Leave a Comment