55012023-07-01 23:53:55AndrosAdószedőcpp17Accepted 30/3096ms38892 KiB
#include <iostream>
#include <vector>
#include <queue>
#define maxN 100002

using namespace std;

//Oktatas.hu-ról letöltött megoldás.
//Szanaszét kommenteztem magyarázattal, ami szerintem helyes.

int N, M, F;
int Tav[maxN];//Távot számolja a fővárostól
int Apa[maxN];//Megmondja, melyik node az, ami a városból jött
vector<int> G[maxN];//Gráf, beindexelve megkapjuk a szomszédait
vector<pair<int, int>> Mego;

int main() {
	//Felszámozza a node-okat a fővárostól való távolsággal.
	//És minden élt belerak a megoldásba, amire igaz, hogy x <-> x+1 összekötés
	//Mert ekkor lehet az, hogy átmegy rajta egy adószedő, így optimális
	ios_base::sync_with_stdio(false); cin.tie(NULL);

	int x, y;

	cin >> N >> M >> F;

	for (int i = 0; i < M; i++) {//Adatbeolvasás
		cin >> x >> y;
		G[x].push_back(y);
		G[y].push_back(x);
	}

	queue<int> S;
	S.push(F);//Fővárost belerakja

	for (int x = 1; x <= N; x++) Tav[x] = 0;

	Tav[F] = 1;//Főváros távja 1

	while (S.size() > 0) {//Amíg van a queue-ban elem
		x = S.front();
		S.pop();
		//Leszedi az első elemet
		for (int y : G[x]) {//Megnézi az összekötéseit

			if (Tav[y] == 0) {//HA MÉG NINCS FELFEDEZVE
				//Queue miatt tuti jó sorrendben fedezi a gráfot
				//Először az 1, utána 2, 3... távokat fedezi fel sorban.
				Tav[y] = Tav[x] + 1;//Távot kiszámolja a fővárostól, ami sorrend miatt helyes
				Mego.push_back({ x,y });//Megoldásba berakja, mert x<->x+1 típusú él

				S.push(y);//queue-ba berakja, hogy felfedezze majd valamikor


				Apa[y] = x;//Apját lementi, csak arra kell, hogy ne írja ki kétszer.
			}
			//HA MÁR FEL VAN FEDEZVE
			//y != Apa[x] :				Hogy csak egyik irányba írassa ki					
			//Tav[y] + 1 == Tav[x] :	Ha x <-> x+1 él
			else if (y != Apa[x] && Tav[y] + 1 == Tav[x]) {
				//Berakja a megoldásba
				Mego.push_back({ x,y });
			}
		}
	}
	//Kiíratás
	cout << Mego.size() << "\n";
	for (auto xy : Mego)
		cout << xy.first << " " << xy.second << "\n";
	return 0;
}
SubtaskSumTestVerdictTimeMemory
base30/30
1Accepted0/04ms6616 KiB
2Accepted0/081ms16320 KiB
3Accepted1/14ms8716 KiB
4Accepted1/14ms9000 KiB
5Accepted1/14ms9284 KiB
6Accepted1/14ms9244 KiB
7Accepted1/14ms9504 KiB
8Accepted1/14ms9632 KiB
9Accepted2/24ms10088 KiB
10Accepted2/26ms10280 KiB
11Accepted2/26ms10532 KiB
12Accepted2/210ms11336 KiB
13Accepted2/218ms12644 KiB
14Accepted2/268ms19136 KiB
15Accepted1/189ms25240 KiB
16Accepted1/176ms23836 KiB
17Accepted2/296ms29716 KiB
18Accepted2/289ms31256 KiB
19Accepted2/296ms33828 KiB
20Accepted2/293ms36480 KiB
21Accepted2/296ms38892 KiB