您的位置:首页 > 编程语言 > C语言/C++

PAT甲级练习题1003

2017-07-23 17:52 357 查看
采用深度优先搜索。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT c++