1003. Emergency (25)
回溯法搜一遍得到答案,变量名千万别取重复了,找了半天错!
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
const int N=502;
int value[N],start[N],cnt=0,visit[N];
struct edge{
int v,w,next;
}e[N*N];
void add(int u,int v,int w){
e[cnt].v=v;
e[cnt].w=w;
e[cnt].next=start[u];
start[u]=cnt++;
}
int tot=0,minW=1e9,maxV=-1;
void dfs(int now,int go,int w,int val){//现在在now,要去go,已经走了w,有了val--回溯法
if(visit[now]) return;
visit[now]=1;
if(now==go){//到达了
if(w<minW){
minW=w;
tot=1;
maxV=val;
}
else if(w==minW){
tot++;
maxV=max(maxV,val);
}
visit[now]=0;
return;
}
for(int i=start[now];i!=-1;i=e[i].next){
int v=e[i].v;
dfs(v,go,w+e[i].w,val+value[v]);
}
visit[now]=0;
}
int main(){
int n,m,c1,c2;
cin>>n>>m>>c1>>c2;
for(int i=0;i<n;i++) {
scanf("%d",&value[i]);
start[i]=-1;
}
for(int i=0,u,v,w;i<m;i++){
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dfs(c1,c2,0,value[c1]);
printf("%d %d",tot,maxV);
return 0;
}