题意:给定n个城市m条路,以及每座城市你可携带的人数,问从s出发到e一共有多少条最短路径以及你可以带领的人数最大值。
tip:深搜完事
#include<iostream>
#include<algorithm>
using namespace std;
int map[502][502];
int teams[502];
int n,m,start,e,minlenth=1e7;
int ans1=0,ans2=0;
int checked[502]= {0};//标记访问城市
void dfs(int s,int lenth,int person) {
checked[s]=1;
if(lenth>minlenth)
return ;
if(s==e) {
if(lenth<minlenth) {//更新最短路径
minlenth=lenth;
ans1=1;
ans2=person;
return ;
} else if(lenth==minlenth) {//更新最短路径条数以及可带领的最大人数
ans1++;
ans2=max(ans2,person);
return ;
} else return;
}
for(int i=0; i<n; ++i)
if(map[s][i]&&!checked[i]) {
dfs(i,lenth+map[s][i],person+teams[i]);
checked[i]=0;
}
}
int main() {
cin>>n>>m>>start>>e;
for(int i=0; i<n; ++i)
cin>>teams[i];
for(int i=0; i<m; ++i) {
int a,b,l;
cin>>a>>b>>l;
map[a][b]=l;
map[b][a]=l;//坑:没说是有向边还是无向边
}
dfs(start,0,teams[start]);
cout<<ans1<<" "<<ans2;
return 0;
}