Vacaciones de invierno 2020 [gmoj1922] [congestión vial en rclock] [ruta más corta de spfa]

Descripción del título

Todas las mañanas, John tiene que caminar desde su casa hasta la granja y puede que tenga que pasar por otros lugares en su camino. Resumimos estos lugares y caminos en una imagen. Hay N puntos en esta imagen, y hay M lados (cada lado es bidireccional), cada lado tiene una longitud y la casa de John está en el primer punto. , La granja está en el enésimo punto, y no hay bordes duplicados entre los dos puntos, y este gráfico es un gráfico conectado. Cada vez que John elige el camino más corto desde su casa hasta la granja.
Pero las vacas de John siempre arruinaban a John. Las vacas planeaban poner algunos pajares en uno de los caminos para impedir que John caminara. De qué manera se colocaban los pajares, la longitud de ese lado era equivalente al doble. Ahora, las vacas quieren saber cómo elegir un pajar lateral para maximizar el viaje de John de casa a la granja.

De entrada

La primera línea son dos enteros positivos N y M.
En las siguientes líneas M, tres enteros a, byc indican que la distancia desde el punto a hasta el punto b es c.

Salida

Produzca la distancia que aumentará a lo sumo el camino más corto desde el hogar hasta la granja.

Entrada de muestra

5 7
2 1 5
1 3 1
3 2 8
3 5 7
3 4 3
2 4 7
4 5 2

Salida de muestra

2

Limitación del rango de datos

1 <= N <= 250,1 <= M <= 25000。

Pronto

[Descripción de la muestra]
Cuando las vacas ponen heno en el lado de 3-4, la longitud del lado de 3-4 es equivalente a cambiar de 3 a 6, y el camino más corto de John se convierte en 1-3-5 La distancia es igual a 1 + 7 = 8, que es 2 más que la longitud más corta original.

Análisis

Esta pregunta es muy violenta porque es la " ruta más corta de una sola fuente ", por lo que se utiliza SPFA.
Primero encuentre el camino más corto de 1 ~ n, y luego enumere cada camino como un lugar para colocar los pajares. La mayor diferencia es la respuesta.

Código en

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,h,t,a[25001],b[25001],c,f[260][260],dis[260],k,ff,mx,v[100010],q[100010];
int spfa()
{
	memset(v,0,sizeof(v));
	memset(q,0,sizeof(q));
	memset(dis,1,sizeof(dis));
	int x;
	dis[1]=0;
	v[1]=1;
	q[1]=1;
	h=0;
	t=1;
	while(h<t)
	{
		h++;
		x=q[h];
		for(int i=1;i<=n;i++)
		{
			if(dis[x]+f[x][i]<dis[i]&&f[x][i]!=0)
			{
				dis[i]=dis[x]+f[x][i];//松弛 
				if(!v[i])
				{
					t++;
					v[i]=1;
					q[t]=i;
				}
			}
		}
		v[x]=0;
	}
	return dis[n];
} 
int main()
{
	freopen("rblock.in","r",stdin);
	freopen("rblock.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
    	scanf("%d%d%d",&a[i],&b[i],&c);
    	f[a[i]][b[i]]=c;
    	f[b[i]][a[i]]=c;
	}
	k=spfa();
	for(int i=1;i<=m;i++)
	{
		f[a[i]][b[i]]*=2;
		f[b[i]][a[i]]*=2;
		ff=spfa();
		f[a[i]][b[i]]/=2;
		f[b[i]][a[i]]/=2;
		if(ff-k>mx) mx=ff-k;
	}
	printf("%d",mx);
	fclose(stdin);
	fclose(stdout);
    return 0;
}

Publicó 110 artículos originales · ganó 100 · visitó 8021

Supongo que te gusta

Origin blog.csdn.net/dglyr/article/details/104931458
Recomendado
Clasificación