题目

题意:给定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;
}