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;
}
}