[PTA] L3-008 Shout Mountain (30 minutos) [BFS]

Llamando a la montaña hay una persona en forma de trompeta con las manos alrededor de la boca, gritando "Hey-hey-hey-hey ..." hacia las montañas distantes. El sonido de la llamada se transmite a través del aire, resonando en los valles profundos, y se transmite a los oídos de las personas, enviando una "señal" convencional para lograr el propósito de transmisión y comunicación del sonido. Resulta que era una "señal" utilizada por los antepasados ​​del pueblo Yi para pedir ayuda. Poco a poco, la gente descubrió su valor práctico en la vida diaria y la utilizó como herramienta de comunicación de generación en generación.

El grito de una montaña puede ser escuchado por la montaña vecina al mismo tiempo. El título asume que cada colina tiene como máximo dos colinas cercanas que pueden escucharlo. Dada cualquier colina que envíe la señal original, esta pregunta le pide que encuentre el lugar más lejano al que puede llegar esta señal.

Formato de entrada: la
primera línea de entrada da 3 enteros positivos n, myk, donde n (≤10000) es el número total de colinas (así que suponga que cada colina está numerada de 1 a n). En las siguientes m líneas, cada línea da 2 números enteros positivos que no exceden n. Los números están separados por espacios para representar los números de las dos colinas que pueden escucharse entre sí. Aquí se garantiza que cada par de colinas se ingresa solo una vez, y no habrá entrada de relación duplicada. La última línea da k (≤10) números enteros positivos que no exceden de N. Los números están separados por espacios para representar el número de la montaña a ser consultada.

Formato de salida:
para cada colina en la entrada, a su vez, la salida es la colina más lejana a la que se puede encadenar la llamada en una línea. Nota: La salida primero debe estar encadenada a la colina que se va a consultar. Si hay más de una de estas colinas, se emite la que tiene el número más pequeño. Si la llamada de esta colina no puede llegar a ninguna otra colina, se emite 0.

Muestra de entrada:

7 5 4
1 2
2 3
3 1
4 5
5 6
1 4 5 7

Salida de muestra:

2
6
4
0

Código:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=10050;
int n,m,k,a,b,x,maxd=0,ans=0,d[maxn]; //maxd最远距离,ans为最远编号最小的山
vector<int> g[maxn]; //邻接表
bool vis[maxn]={
    
    false}; //标志是否入队

void bfs(int u)
{
    
    
	queue<int> q;
	q.push(u);
	vis[u]=1;
	while(!q.empty())
	{
    
    
		int f = q.front();
		q.pop();
		for(int i=0;i<g[f].size();i++)
		{
    
    
			int v=g[f][i];
			if(!vis[v])
			{
    
    
				vis[v]=1;
				d[v]=d[f]+1; //更新深度
				if(maxd<d[v]) maxd=d[v],ans=v; // 更新最远距离和此时的山
				else if(maxd==d[v]) ans=min(ans,v); //最远距离相等,要编号小的山
				q.push(v);
			}
		}
	}
}

int main()
{
    
    	    
	cin>>n>>m>>k;
	for(int i=0;i<m;i++)
	{
    
    
		cin>>a>>b;
		g[a].push_back(b); //无向边
		g[b].push_back(a);
	}
	
	for(int i=0;i<k;i++)
	{
    
    
		cin>>x;
		ans=maxd=0; //初始化
		fill(d,d+maxn,0);
		fill(vis,vis+maxn,0);
		bfs(x);
		cout<<ans<<endl;
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45260385/article/details/110140750
Recomendado
Clasificación