Comisarías D. (origen Super + BFS)

título

Significado de las preguntas:

    Dado un árbol, el nodo del árbol tiene k puntos en las comisarías. Quitar el árbol requiere tanta ventaja, pero para asegurarse de que cada distancia punto a partir del punto de la policía de no más de d.
     2 norte 3 1 0 5 , 1 k 3 1 0 5 , 0 re norte - 1 2 ≤ n ≤ 3 · 10 ^ 5, 1 ≤ k ≤ 3 · 10 ^ 5, 0 ≤ d ≤ n - 1

análisis:

    Hay muchos puntos para cumplir con las condiciones de hecho deben pensar origen estupendo, después de pensar esta cuestión ha sido el origen de la idea de un super muy natural. Construir un origen súper incluso a aquellos que señalan la estación de policía, a continuación, que es construir un árbol (suprimido debido a tantos lados), de modo que la distancia desde el origen hasta el punto del árbol es menor o igual a k + 1. Así que empieza a las BFS origen, a un punto en el que desea actualizar el punto original que está conectado, si ese punto se ha actualizado, a continuación, se explica que el punto de origen puede ser alcanzado a través de otro lado, sin la necesidad de presentar este borde, en este caso esto puede ser mediante la eliminación de los bordes.

#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue> 
using namespace std;

map<int,map<int,int> >id;
vector<int> p,g[300005];
int vis[300005],flag[300005],pre[300005];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,k,d;
	cin >> n >> k >> d;
	for (int i = 1; i <= k; i++)
	{
		int x;
		cin >> x;
		if( flag[x] == 0 )
		{
			p.push_back(x);
			flag[x] = 1; 
		}
	}
	for (int i = 1; i < n; i++)
	{
		int x,y;
		cin >> x >> y;
		id[x][y] = id[y][x] = i;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	set<int> ans;
	queue<int> q;
	for (int i = 0; i < p.size(); i++)
	{
		q.push(p[i]);
		vis[p[i]] = 1;
	}
	while( !q.empty() )
	{
		int x = q.front();
		q.pop();
		for (int j = 0; j < g[x].size(); j++)
		{
			int t = g[x][j];
			if( vis[t] != 0 && pre[x] != t ) 
			{
				ans.insert(id[x][t]);
				continue;
			}
			if( vis[t] ) continue;
			pre[t] = x;
			vis[t] = 1;
			q.push(t);
		}
	}
	cout << ans.size() << '\n';
	set<int>:: iterator it;
	for (it = ans.begin(); it != ans.end(); it++)
	{
		cout << *it;
		if( it == --ans.end() ) cout << '\n';
		else cout << ' ';
	} 
	return 0;
}

Publicados 132 artículos originales · ganado elogios 6 · vistas 7907

Supongo que te gusta

Origin blog.csdn.net/weixin_44316314/article/details/105150551
Recomendado
Clasificación