55012023-07-01 23:53:55AndrosAdószedőcpp17Elfogadva 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base30/30
1Elfogadva0/04ms6616 KiB
2Elfogadva0/081ms16320 KiB
3Elfogadva1/14ms8716 KiB
4Elfogadva1/14ms9000 KiB
5Elfogadva1/14ms9284 KiB
6Elfogadva1/14ms9244 KiB
7Elfogadva1/14ms9504 KiB
8Elfogadva1/14ms9632 KiB
9Elfogadva2/24ms10088 KiB
10Elfogadva2/26ms10280 KiB
11Elfogadva2/26ms10532 KiB
12Elfogadva2/210ms11336 KiB
13Elfogadva2/218ms12644 KiB
14Elfogadva2/268ms19136 KiB
15Elfogadva1/189ms25240 KiB
16Elfogadva1/176ms23836 KiB
17Elfogadva2/296ms29716 KiB
18Elfogadva2/289ms31256 KiB
19Elfogadva2/296ms33828 KiB
20Elfogadva2/293ms36480 KiB
21Elfogadva2/296ms38892 KiB