第一次着手解決這類題,感覺思想很簡單,但卻無從下手,主要參考這篇博客(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;
}