给定一个 n个点 m 条边构成的无重边和自环的无向连通图。
点的编号为 1∼n。
请问:从 1到 n 的最短距离。去掉 k 条边后,从 1 到 n的最短距离。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。每组数据第一行包含三个整数 n,m,k。接下来 m行,每行包含三个整数 x,y,z,表示点 x 和点 y 之间存在一条长度为 z 的边。最后一行包含 k 个空格隔开的整数,表示去掉的边的编号。所有边按输入顺序从 1 到 m 编号。
输出格式
每组数据输出占两行。
第一行输出从 1到 n 的最短距离。
第二行输出去掉 k条边后,从 1 到 n 的最短距离。无法到达,则输出 −1。
数据范围
1≤T≤10,
1≤n≤50,
1≤m≤n(n−1)2,
1≤x,y≤n,
1≤z≤100,
1≤k≤m
输入样例:
1
4 4 1
1 2 1
2 3 1
3 4 1
1 4 1
4
输出样例:
1
3
#include<iostream>
#include<cstring>
using namespace std;
const int N=55,M=N*N/2,INF=0x3f3f3f3f;
int d[N][N],g[N][N];
int n,m,q;
struct edge{int a,b;
}e[M];
void floyd()
{memcpy(d,g,sizeof d);for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
int main()
{int T;cin>>T;while(T--){cin>>n>>m>>q;memset(g,0x3f,sizeof g);for(int i=1;i<=n;i++) g[i][i]=0;for(int i=1;i<=m;i++){int a,b,c;cin>>a>>b>>c;g[a][b]=g[b][a]=c;e[i].a=a,e[i].b=b;}floyd();cout<<d[1][n]<<endl;while(q--){int t;cin>>t;int a=e[t].a,b=e[t].b;g[a][b]=g[b][a]=INF;} floyd();if(d[1][n]==INF) cout<<"-1"<<endl;else cout<<d[1][n]<<endl;}return 0;
}