或者那位好心人能帮我看看代码QAQ
//t6:2147483646,应为 9。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e4+5;
const int maxm=2e5+5;
const int inf=0x7fffffff-1;
int n,m,k,c;
map<pair<int,int>,bool > mp;
struct Edge{
int v,next,w;
}edge[maxm<<1];
int cnt,head[maxn],vis[maxn],dis[25][maxn],f[25][(1<<20)+5],mus[25];
struct cc{
int v,next;
}g[1000];//判断重边?
int cnt1,head1[maxn];
void add(int u,int v,int w){
edge[++cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
void ad(int u,int v){
g[++cnt1].v=v;
g[cnt].next=head1[u];
head1[u]=cnt1;
}
struct qnode{
int v,dis;
friend bool operator < (qnode x,qnode y){
return x.dis>y.dis;//
}
};
void dij(int x){
priority_queue<qnode> q;
for(int i=1;i<=n;i++) dis[x][i]=inf;
dis[x][x]=0;
q.push((qnode){x,0});
while(!q.empty()){
qnode temp=q.top();
q.pop();
int u=temp.v;
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(!vis[v]&&dis[x][v]>dis[x][u]+edge[i].w){
dis[x][v]=dis[x][u]+edge[i].w;
q.push((qnode){v,dis[x][v]});
}
}
}
}
bool ok(int x){//是否符合要求
int num=2;
int stan=x;
while(x){
if((x&1)==1){
if((stan|mus[num])!=stan) return false;
}
x>>=1;
num++;
}
return true;
}
int sure[25];
int dfs(int x){//通过一棵树从下向上遍历求一下限制条件的状态s
if(sure[x]) return mus[x];
if(head1[x]==0) return 1<<(x-2);
for(int i=head1[x];i;i=g[i].next){
int v=g[i].v;
mus[x]|=dfs(v);
}
sure[x]=1;
return mus[x];
}
int nonin[25];//入度为0的点的编号
int main(){
cin>>n>>m>>k;
int u,v,w;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);//lld
if(mp[make_pair(u,v)]!=1){
add(u,v,w);
add(v,u,w);
}
mp[make_pair(u,v)]=1;
}
cin>>c;
int x,y;
for(int i=1;i<=c;i++){
scanf("%d%d",&x,&y);
mus[y]|=(1<<(x-2));
nonin[x]=1;
if(mp[make_pair(x,y)]!=1){
ad(y,x);
}
mp[make_pair(x,y)]=1;
}
for(int i=2;i<=k+1;i++){
if(!nonin[i]){
dfs(i);
}
}
for(int i=1;i<=k+1;i++){
memset(vis,0,sizeof vis);
dij(i);
}
for(int i=1;i<=k+1;i++){
for(int j=0;j<=((1<<k)-1);j++){
f[i][j]=inf;
}
}
for(int i=2;i<=k+1;i++){
f[i][(1<<(i-2))]=dis[1][i];
}
int minn=inf;
for(int j=1;j<=((1<<k)-1);j++){
//if((j&mus[i])!=j) continue;//
if(!ok(j)) continue;
for(int l=2;l<=k+1;l++){
//if(j&(1<<(l-2))) continue;//可不加
if(f[l][j]==inf) continue;
for(int i=2;i<=k+1;i++){
if(i==l) continue;
if((mus[i]|j)==j)
f[i][j|(1<<(i-2))]=min(f[i][j|(1<<(i-2))],f[l][j]+dis[l][i]);
}
}
}
for(int i=2;i<=k+1;i++){
minn=min(minn,f[i][(1<<k)-1]+dis[i][n]);//k
}
cout<<minn<<endl;
return 0;
}