第一次着手解决这类题,感觉思想很简单,但却无从下手,主要参考这篇博客(http://blog.csdn.net/iaccepted/article/details/21451949)写的
值得学习的地方:
-图用一个二维数组存储
-dfs函数的大概模式(判断是否到末节点,剪枝,递归调用......)
#include <iostream>
#include <climits>
using namespace std;
const int MAX=501;
int v,teams[MAX],visit[MAX], map[MAX][MAX];
int cnt=0;
int maxt=0;
int minl=INT_MAX;
void init(int n){
for(int i=0;i<n;i++){
visit[i]=0;
for(int j=0;j<n;j++)
map[i][j]=INT_MAX;
}
}
void dfs(int s,int e,int team,int len){
if(s==e){
if(len<minl){
minl=len;
cnt=1;
maxt=team;
}else if(len==minl){
cnt++;
if(maxt<team)
maxt=team;
}
return;
}
//剪枝
if(len>minl)return;
for(int i=0;i<v;i++){
if(visit[i]==0&&map[s][i]<INT_MAX){
visit[i]=1;
dfs(i,e,team+teams[i],len+map[s][i]);
visit[i]=0;
}
}
}
int main()
{
int e,start,end;
cin>>v>>e>>start>>end;
for(int i=0;i<v;i++)
cin>>teams[i];
init(v);
int v1,v2,l;
int m=e;
while(m--){
cin>>v1>>v2>>l;
if(map[v1][v2]>l)
map[v1][v2]=map[v2][v1]=l;
}
dfs(start,end,teams[start],0);
cout<<cnt<<" "<<maxt;
return 0;
}