Shortest Path Problema C (2019 ordenador)

Problema C carretera de la ciudad
el tiempo límite de 1.000 ms límite de memoria 65536 KB

título Descripción

Varios carretera entre n ciudades, algunas de las necesidades manera de cerrar la noche, el camino más corto se determina cada ciudad en ciudad n1 día y la noche.

Formato de entrada

Un primer conjunto de datos de comportamiento para cada número de prueba T

La primera fila de tres números enteros, n, m, k. (1 <= n <= 50) n representa el número de ciudades, m representa el número de caminos, k denota el número de la noche necesidad camino a ser cerrado.

Siguiente m líneas de tres números enteros a, b, c (1 < = a, b <= n), donde i-ésima fila (1 <= i <= m ) denota el i-ésimo
camino de ciudad en una b urbano longitud C (borde puede ser duplicados).

k líneas siguientes, cada uno un entero w, representa el número de la noche para cerrar la carretera.

Formato de salida

Dos líneas de salida de datos cada uno

Una primera conducta durante el día distancia más corta de ciudad en ciudad n es 1

La primera noche, el comportamiento de la distancia más corta desde la ciudad 1 a la ciudad n

Ejemplo de entrada

1
4 4 1
1 2 1
2 3 1
3 4 1
1 4 1
4

Ejemplo de salida

1
3

triple bucle Floyd

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T,n,m,k;
	int a,b,c;
	int w;
	int dis[55][55];
	int dis1[55][55];
	int num[55][2];//记录第几条路 
	cin>>T;
	while(T--){
		cin>>n>>m>>k;
		for(int i=0;i<55;i++){//初始化为不可达 
			for(int j=0;j<55;j++){
				dis[i][j]=99999;
				dis1[i][j]=99999;
			}
		}
		for(int i=1;i<=m;i++){
			cin>>a>>b>>c;//从城市a到城市b长度为c
			dis[a][b]=c;
			dis[b][a]=c;
			
			dis1[a][b]=c;
			dis1[b][a]=c;
			
			num[i][0]=a;
			num[i][1]=b;
		}
		for(int p=1;p<=m;p++){
			for(int i=1;i<=m;i++){
				for(int j=1;j<=m;j++){
					if(dis[i][p]!=99999&&dis[p][j]!=99999&&dis[i][j]>dis[i][k]+dis[k][j]){
						dis[i][j]=dis[i][k]+dis[k][j];
					}
				}
			}
		}
		cout<<dis[1][n]<<endl;
		while(k--){
			cin>>w;
			dis1[num[w][0]][num[w][1]]=99999;
			dis1[num[w][1]][num[w][0]]=99999;
		}
		for(int k=1;k<=m;k++){
			for(int i=1;i<=m;i++){
				for(int j=1;j<=m;j++){
					if(dis1[i][k]!=99999&&dis1[k][j]!=99999&&dis1[i][j]>dis1[i][k]+dis1[k][j]){
						dis1[i][j]=dis1[i][k]+dis1[k][j];
					}
				}
			}
		}
		cout<<dis1[1][n]<<endl;
	}
}
Publicado 67 artículos originales · ganado elogios 111 · Vistas a 60000 +

Supongo que te gusta

Origin blog.csdn.net/chaokudeztt/article/details/104826925
Recomendado
Clasificación