rt。
#include<bits/stdc++.h>
const int MAXN=505;
typedef long long LL;
const LL INF=1e15;
int n,m,k,d[MAXN],Q;
bool ok[MAXN];
LL T,dis[MAXN][MAXN];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=INF;
for(int i=1;i<=n;i++) dis[i][i]=0;
LL w;
for(int _=1,u,v;_<=m;_++)
{
scanf("%d%d%lld",&u,&v,&w);
dis[u][v]=dis[v][u]=std::min(dis[u][v],w);
}
scanf("%d%d",&k,&T);
for(int i=1;i<=k;i++) scanf("%d",&d[i]);
for(int i=1;i<=k;i++) ok[d[i]]=1;
for(int i=1;i<=n;i++)
{
if(!ok[i]) continue;
for(int j=1;j<=n;j++)
{
if(!ok[j]) continue;
dis[i][j]=std::min(dis[i][j],T);
}
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=std::min(dis[i][j],dis[i][k]+dis[k][j]);
scanf("%d",&Q);
LL t;
for(int _=1,op,x,y;_<=Q;_++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d%lld",&x,&y,&t);
if(t>=dis[x][y]) continue;
dis[x][y]=t;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=std::min(dis[i][j],dis[i][x]+dis[y][j]+t),
dis[i][j]=std::min(dis[i][j],dis[i][y]+dis[x][j]+t);
}
else if(op==2)
{
scanf("%d",&x);
if(ok[x]) continue;
ok[x]=1;
for(int i=1;i<=n;i++)
{
if(!ok[i]) continue;
else if(T>=dis[x][i]) continue;
dis[x][i]=dis[i][x]=T;
for(int a=1;a<=n;a++)
for(int b=1;b<=n;b++)
dis[a][b]=std::min(dis[a][b],dis[a][x]+dis[i][b]+T),
dis[a][b]=std::min(dis[a][b],dis[a][i]+dis[x][b]+T);
}
}
else if(op==3)
{
LL ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dis[i][j]!=INF)
ans+=dis[i][j];
printf("%lld\n",ans);
}
}
return 0;
}
回复请 at 我。