图片说明
上面是爆搜+剪枝
下面是正解

爆搜加剪枝你值得拥有。

if(sum>=ans) return;
if(sum>=ans) return;
if(sum>=ans) return;

对加了这句话,就ok了。
爆搜的代码也不需要多解释了,今天突然想起来剪枝一下好像可以就试了试。
其实就是dfs暴力所有路径。。。加了一个再普通不过的剪枝。

代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define endl '\n'
#define ios std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
//#define int long long
const int maxn = 2e4+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1e9+7;
using namespace std;

bool visited[1010];
struct wazxy{
    int to,w,next;
}edge[maxn];
int head[maxn],cnt=1;
int n,m,k;
int p[maxn],ans;
inline void add(int u,int v,int w){
    edge[cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
void dfs(int x,int sum,int d){
    if(x==n){
        ans=min(ans,sum);
        return ;
    }
    if(sum>=ans) return;
    if(d>k-1) return;
    for(int i=head[x];i;i=edge[i].next){
        if(!visited[edge[i].to]){
            visited[edge[i].to]=true;
            dfs(edge[i].to,sum+edge[i].w+p[d],d+1);
            visited[edge[i].to]=false;
        }
    }
}
int main(){
    ios
    cin>>n>>m>>k;
    for(int i=0;i<m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,w);
    }
    for(int i=0;i<k;i++){
        cin>>p[i];
    }
    memset(visited,false,sizeof visited);
    ans=MaxN;
    dfs(1,0,0);
    if(ans==MaxN) cout<<-1;
    else cout<<ans<<endl;
    return 0;

}