采用深度优先搜索。
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
//采用深度优先搜索
int minlen=INT_MAX; //最短路径
int num; //路径数
int maxteam; //最大的救援队数量
int N; //节点总数
int Len[500][500]={0};//城市之间距离
int team[500]={0}; //每个城市对应的救援队数量
bool S[500]; //表明当前城市是否被选用
void dfs(int node,const int end,int len,int mteam)
{
if(node==end) //当前节点在终点时
{
if(len<minlen)
{
minlen=len; //最短路径重新计数
maxteam=mteam; //总救援队重新计数
num=1; //最短路径个数重新计数
}
else
{
if(len==minlen) //多了一条路径选择
{
++num;
if(mteam>maxteam)
maxteam=mteam;
}
}
return;
}
if(len>minlen) //当前距离已大于最短距离时,放弃
{
return;
}
int p;
for(p=0;p<N;++p)
{
if(S[p] && Len[node][p]!=0) //当前节点未被选择且有通路时
{
S[p]=false;
dfs(p,end,len+Len[node][p],mteam+team[p]);
S[p]=true;
}
}
}
int main()
{
int M,C1,C2;
cin>>N>>M>>C1>>C2;
int i,j,k,L;
for(i=0;i<N;++i)
{
cin>>team[i];
S[i]=true;
}
for(k=0;k<M;++k)
{
cin>>i>>j>>L;
Len[i][j]=L;
Len[j][i]=L;
}
S[C1]=false;
dfs(C1,C2,0,team[C1]);
cout<<num<<" "<<maxteam<<endl;
return 0;
}