上面是爆搜+剪枝
下面是正解
爆搜加剪枝你值得拥有。
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;
}

京公网安备 11010502036488号