AcWing 3556. 最短路径
原题链接
简单
//直接floyd ,第一遍求1到n的最短路,第二遍求删掉k条边之后剩下点的最短路
//第一遍是联通的,所以最短路一定存在
//为了后面能把边删掉,所以先将所有边存下来
#include<bits/stdc++.h>
using namespace std;
const int N=55,M=N*N/2,INF=0x3f3f3f3f;
int n,m,k;
int g[N][N],d[N][N];
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>>k;
memset(g,0x3f,sizeof g);
for(int i=0;i<n;i++) g[i][i]=0;
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
e[i]={a,b};
g[a][b]=g[b][a]=c;
}
floyd();
cout<<d[1][n]<<endl;
while(k--)
{
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) puts("-1");
else cout<<d[1][n]<<endl;
}
return 0;
}