問題のC市の道路
の制限時間は1000ms 65536キロバイトのメモリ制限
タイトル説明
nは都市間のいくつかの道路、いくつかの方法は、最短経路は市内nは1日や夜に各都市を決定し、夜間閉鎖する必要があります。
入力形式
各試験番号Tの行動データの最初のセット
三つの整数、N、M、Kの最初の行。(1 <= N <= 50)N都市の数を表し、mは、kが閉鎖される夜道路必要の数を示し、道路の数を表します。
三つの整数、B、C(1 <次のm行 =、B <= N)、 i行目(1 <= l <= M ) i番目の意味
に都市から道路を都市長C B(エッジが重複してもよいです)。次のk行、各整数wは、道路を閉じるために夜の数を表します。
出力フォーマット
二つのデータ出力ライン毎
都市への都市から第昼間の動作の最短距離nは1
最初の夜、市内nに市1からの最短距離の振る舞い
サンプル入力
1
4 4 1
1 2 1
2 3 1
3 4 1
1 4 1
4
サンプル出力
1
3
フロイドトリプルループ
#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;
}
}