计算最短路径的条数,用dfs会比较的好用。
注意dfs函数中的一些细节问题,比如递归结束后设置节点未访问。
dfs的参数设置,学习这种带多参的递归方法。
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
#define maxn 505
int wei[maxn],visit[maxn],mapp[maxn][maxn];
int mind,cnt,maxt,num;
void dfs(int start,int endd,int dist,int weit)
{
if(start==endd)
{
if(dist<mind)
{
mind=dist;
maxt=weit;
cnt=1;
}
else if(dist==mind)
{
cnt++;
if(weit>maxt)
maxt=weit;
}
else
return;
return;
}
if(dist>=mind)
return;
//此处不进行剪枝的话,最后的测试样例会超时,实际意义在于
//如果当前路径还未到达终点,距离却已经超过了当前的最短路径,那么后面的深搜也不用做了
int i;
for(i=0;i<num;i++)
{
if(visit[i]==0&&mapp[start][i]!=maxn)
{
visit[i]=1;
dfs(i,endd,dist+mapp[start][i],weit+wei[i]);
visit[i]=0;//递归完成后设置未访问,不影响别的递归过程
}
}
return;
}
void init(int num)
{
int i,j;
for(i=0;i<num;i++)
visit[i]=0;
for(i=0;i<num;i++)
for(j=0;j<num;j++)
mapp[i][j]=maxn;
return;
}
int main()
{
int m,c1,c2;
int i,j,k,l,n;
scanf("%d %d %d %d",&num,&m,&c1,&c2);
init(num);
mind=maxn;
cnt=0;
maxt=0;
for(i=0;i<num;i++)
scanf("%d",&wei[i]);
for(j=0;j<m;j++)
{
scanf("%d %d %d",&k,&l,&n);
if(n<mapp[k][l])
{
mapp[k][l]=n;
mapp[l][k]=n;
}
}
dfs(c1,c2,0,wei[c1]);
printf("%d %d",cnt,maxt);
return 0;
}