PAT甲級練習題1003
阿新 • • 發佈:2018-12-23
採用深度優先搜尋。
#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; }