He thong dien

 avatar
quoc14
c_cpp
23 days ago
3.4 kB
2
Indexable
Never
DFS and BFS
Level 4
Hệ thống điện
Hệ thống điện

Sau khi anh VenG đã xây dựng đường đi giữa những hòn đảo, anh Eagle được cử sang để xây dựng hệ thống điện giữa các hòn đảo cho người dân, do muốn ăn bớt kinh phí nên anh Eagle không xây dựng trạm phát điện trên tất cả các đảo mà chỉ xây trên 1 số đảo nhất định. Các đảo kết nối với nhau thành 1 mạng lưới điện. Rõ ràng những đảo nào ở càng xa nguồn phát thì điện sẽ càng yếu.

Để đảm bảo người dân không than phiền điện yếu, nên anh Eagle muốn tính toán xem điện ở đảo nào sẽ yếu nhất.

Độ yếu của điện tại đảo X được tính bằng 0 nếu đảo đó có trạm phát điện, nếu đảo X có kết nối điện với đảo Y mà đảo Y ở gần trạm phát hơn, độ yếu tại đảo X = độ yếu tại đảo Y + 1. Nếu đảo X không có điện thì có độ yếu bằng vô cùng (infinity).

Input

Dòng đầu tiên chứa số testcase T.

Mỗi test case gồm:

Dòng đầu tiên gồm 3 số nguyên N, M, H lần lượt là số đảo, M là số đảo có trạm phát điện, H là số kết nối 2 chiều. (N, M <= 1 000, H <= 10 000).

Dòng tiếp theo gồm M số là ID các đảo có máy phát điện (ID đánh số từ 0 tới N-1).

H dòng tiếp theo, mỗi dòng gồm 2 số u, v, cho biết đảo u có kết nối với đảo v.

 

Output

In ra đảo độ yếu của điện là cao nhất. Nếu có nhiều đáp án, in ra đảo có ID nhỏ nhất.

Example

Input:

2

6 3 5

0 5 2

0 1

1 2

4 5

3 5

0 2

6 2 3

5 2

0 5

0 1

3 4

 

Output:

 

1

3

1
0
0
1
9
9
0
0
3
160
259
100
1
999
796
Time: 0.46300 s.

#include <iostream>
#include <time.h>

using namespace std;

int oo = 2000000000;

int T, n, m, h, result, maxx;
int arr[1001][2], a[1001], mp[1001][1001], vs[1001];

int head, tail, q[1000001];

void bfs(int index){
	head = 0, tail = 0;
	q[tail++] =  index;

	while(head != tail){
		int x = q[head];

		head++;

		for(int i = 0; i < n; i++){
			if(mp[x][i] == 1 && vs[i] > vs[x] + 1){
				vs[i] = vs[x] + 1;
				q[tail++] = i;
			}
		}
	}
}

int main(){
	// read input
	freopen("input.txt", "r", stdin);

	//calc time
	clock_t tStart, tStop;
	tStart = clock();

	cin >> T;
	
	for(int tc = 1; tc <= T; tc++){
		// input and initial
		cin >> n >> m >> h;

		for(int i = 0; i < n; i++){
			for(int j = 0; j < n; j++){
				mp[i][j] = 0;
			}
			vs[i] = oo;
		}

		for(int i = 0; i < m; i++){
			cin >> a[i];
			vs[a[i]] = 0;
		}

		for(int i = 0; i < h; i++){
			int x, y;
			cin >> x >> y;
			mp[x][y] = 1, mp[y][x] = 1;
		}
		result = oo, maxx = -1;

		// solve problem
		if(m == n){
			result = 0;
		} else{
			for(int i = 0; i < m; i++){
				bfs(a[i]);
			}
			for(int i = 0; i < n; i++){
				if((maxx < vs[i]) || (maxx == vs[i] && result > i)){
					result = i, maxx = vs[i];
				} 
			}
		}

		// output
		cout << result << endl;
	}


	//calc time
	tStop = clock();
	cout.setf(ios::fixed);
	cout.precision(5);
	cout << "Time: " << double(tStop - tStart) / CLOCKS_PER_SEC << " s." << endl;

	return 0;
}
Leave a Comment