解析:
跑一边Dijkstra,累计破坏的路即可
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=105;
typedef long long ll;
struct edge{
int to,w;
edge(int a,int b):to(a),w(b){}
};
struct node{
int id,dis;
node(int a,int b):id(a),dis(b){}
bool operator<(const node &a)const{
return dis>a.dis;
}
};
int n,m,k,res,pre[N],sx,sy;
vector<edge>e[N];
set<pair<int,int>>p;
map<pair<int,int>,int>mp;
vector<int>v;
void print(int s,int t){
if(s==t){
v.push_back(s);
return;
}
print(s,pre[t]);
v.push_back(t);
}
int Dijkstra(){
int dis[N],done[N];
for(int i=1;i<=n;i++) dis[i]=INF,done[i]=0;
dis[sx]=0;
priority_queue<node>q;
q.push({sx,dis[sx]});
while(!q.empty()){
node u=q.top();
q.pop();
if(done[u.id]==1) continue;
done[u.id]=1;
for(int i=0;i<e[u.id].size();i++){
edge x=e[u.id][i];
if(done[x.to]) continue;
if(dis[x.to]>x.w+u.dis){
dis[x.to]=x.w+u.dis;
q.push({x.to,dis[x.to]});
pre[x.to]=u.id;
}
}
}
print(sx,sy);
for(int i=1;i<v.size();i++){
int x=v[i-1],y=v[i];
if(p.count({x,y})||p.count({y,x})){
if(mp.count({x,y})) res+=mp[{x,y}];
else res+=mp[{y,x}];
}
}
printf("%d",res);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
e[a].push_back({b,w});
e[b].push_back({a,w});
mp[{a,b}]=w;
}
scanf("%d",&k);
for(int i=1;i<=k;i++){
int a,b;
scanf("%d%d",&a,&b);
p.insert({a,b});
}
scanf("%d%d",&sx,&sy);
Dijkstra();
return 0;
}