G 都过了,F题不就是考虑删边转加边,每加一条边考虑对任意点对的影响吗??然后 Floyd,过了样例但是wa了,求调
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=3e2+7,maxq=2e5+7,inf=1e16;
int n,m,t;
int mp[maxn][maxn],ans[maxq],l[maxq],r[maxq],w[maxq];
bool is[maxq];
struct node{
int opt,x,y;
}q[maxq];
signed main(){
memset(is,1,sizeof(is));
scanf("%lld%lld%lld",&n,&m,&t);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) if(i!=j) mp[i][j]=inf;
}
for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&l[i],&r[i],&w[i]);
for(int i=1;i<=t;i++){
scanf("%lld%lld",&q[i].opt,&q[i].x);
if(q[i].opt==1) is[q[i].x]=0;
else scanf("%lld",&q[i].y);
}
for(int i=1;i<=m;i++) if(is[i]) mp[l[i]][r[i]]=mp[r[i]][l[i]]=min(mp[l[i]][r[i]],w[i]);
for(int i=t;i;i--){
if(q[i].opt==1){
int j=q[i].x;
mp[l[j]][r[j]]=mp[r[j]][l[j]]=min(mp[l[j]][r[j]],w[j]);
for(int g=1;g<=n;g++){
mp[g][l[j]]=mp[l[j]][g]=min(mp[g][l[j]],mp[g][r[j]]+mp[l[j]][r[j]]);
mp[g][r[j]]=mp[r[j]][g]=min(mp[g][r[j]],mp[g][l[j]]+mp[l[j]][r[j]]);
}
for(int g=1;g<=n;g++){
for(int h=1;h<=n;h++){
mp[g][h]=min(mp[g][h],mp[l[j]][r[j]]+min(mp[g][l[j]]+mp[r[j]][h],mp[g][r[j]]+mp[l[j]][h]));
}
}
}else ans[i]=mp[q[i].x][q[i].y];
}
for(int i=1;i<=t;i++){
if(q[i].opt==2){
if(ans[i]!=inf) printf("%lld\n",ans[i]);
else puts("-1");
}
}
return 0;
}