1. 程式人生 > >PAT甲級練習題1003

PAT甲級練習題1003

採用深度優先搜尋。

#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;
}