PAT.A1018 Gestión de bicicletas públicas

Volver a contenidosInserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Titulo

Hay algunas estaciones públicas de bicicletas en la ciudad. La capacidad máxima de bicicletas de cada estación es un número par Cmax, y si el número de bicicletas en una estación es exactamente Cmax / 2, entonces se dice que la estación está en un "estado perfecto". Si la capacidad de una estación está llena o vacía, el centro de control (PBMC) transportará o recogerá un cierto número de bicicletas desde la carretera hasta la estación, de modo que la estación problemática y todas las estaciones en el camino alcanzarán un "estado perfecto". Ahora proporcione Cmax, el número de estaciones N (excluyendo el centro de control PBMC), el número de estación problemática Sp, el número de bordes no dirigidos M y los pesos de borde, encuentre la ruta más corta desde el PBMC (marcado como 0) hasta la estación problemática Sp, la salida necesita El número de bicicletas transportadas desde PBMC, el camino más corto y el número de bicicletas que deben devolverse después de llegar a la estación problemática. Si hay varias rutas más cortas, elija la que tenga menos bicicletas de PBMC: si todavía hay varias, seleccione la que tenga menos bicicletas traídas de la estación problemática. Nota: El proceso de ajuste de todas las estaciones en el camino debe completarse durante el viaje a la estación problemática, y no se realizará ningún ajuste cuando regrese.

Muestra (se puede copiar)

10 3 3 5
6 7 0
0 1 1
0 2 1
0 3 3
1 3 1
2 3 1
//output
3 0->2->3 0

Puntos a tener en cuenta

  1. La solución a este problema es Djikstra + DFS. Específicamente: primero use Dijkstra para encontrar la ruta más corta y, en el proceso de búsqueda, registre el nodo precursor de cada nodo de cada ruta. Use DFS para comenzar desde el sitio del problema, use el nodo precursor recién registrado para regresar a PBMC, registre la ruta y luego comience desde PBMC para calcular la cantidad de bicicletas que deben llevarse y la cantidad de bicicletas que deben recuperarse. Actualiza el camino más corto.
#include<bits/stdc++.h>
using namespace std;

int Cmax,n,sp,m,minneed=INT_MAX,minremain=INT_MAX;//Cmax为最大容量,n为顶点数,sp为问题站点,m为边数
int G[510][510],weight[510],dis[510];//G为图,weight为车站单车数量,dis为到某节点的距离
bool vis[510]={false};//标记是否访问过该节点
vector<int> temp,path,pre[510];//temp为临时路径,path为最短路径,pre存储前驱节点
void Dijkstra(){
	fill(dis,dis+n+1,INT_MAX); //注意第二个参数为dis+n+1
	dis[0]=0;
	while(!vis[sp]){
		int v,minn=INT_MAX;
		for(int i=0;i<=n;i++){
			if(!vis[i]&&dis[i]<minn){
				minn=dis[i];
				v=i;
			}
		}	
		vis[v]=true;
		for(int i=0;i<=n;i++){
			if(!vis[i]&&G[v][i]!=0&&dis[i]>dis[v]+G[v][i]){
				dis[i]=dis[v]+G[v][i];
				pre[i].clear();
				pre[i].push_back(v);
			}else if(!vis[i]&&G[v][i]!=0&&dis[i]==dis[v]+G[v][i]){
				pre[i].push_back(v);
			}
		}
	}
}
void DFS(int v){
    temp.push_back(v);
	if(v==0){
		int need=0,remain=0;
		for(int i=temp.size()-1;i>=0;i--){//注意从后往前才是从PBMC出发到问题站点的路径
			int now=temp[i];
			if(weight[now]>=0){
				remain+=weight[now];
			}else{
				if(remain>abs(weight[now])){
					remain+=weight[now];
				}else{
					need+=abs(weight[now])-remain;
					remain=0;
				}
			}
		}
		if(need<minneed){
			path=temp;
			minneed=need;
			minremain=remain;
		}else if(need==minneed&&remain<minremain){
			path=temp;
			minneed=need;
			minremain=remain;
		}
		temp.pop_back();
		return;
	}
	for(int i=0;i<pre[v].size();i++)DFS(pre[v][i]);
	temp.pop_back();
}
int main(){
	cin>>Cmax>>n>>sp>>m;
	for(int i=1;i<=n;i++){
		scanf("%d",&weight[i]);
		weight[i]-=Cmax/2; 
	} 
	int u,v,w;
	while(m--){
		scanf("%d%d%d",&u,&v,&w);
		G[u][v]=G[v][u]=w;
	}
	Dijkstra();
	DFS(sp);
	printf("%d ",minneed);
	for(int i=path.size()-1;i>=0;i--){
		printf("%d",path[i]);
		if(i>0)printf("->");
	}
	printf(" %d",minremain);
    return 0;
}
177 artículos originales publicados · elogiados 5 · visitas 6652

Supongo que te gusta

Origin blog.csdn.net/a1920993165/article/details/105567424
Recomendado
Clasificación