题目要求:
输出最短路径的条数(程序中我用cnt表示)和满足路径最短的情况下最多救的人数(程序中我用maxt表示)。
实现:
用dfs求得c1到c2的路径:如果dis < dismin,则cnt=1,dismin=dis,maxt=num;
如果dis==dismin,则当前最短路径条数cnt+1,如果maxt < num,maxt==num;
如果dis>dismin,直接返回,剪枝(如果没有这一步会超时)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1e8
using namespace std;
const int MAX=505;
int n,m,c1,c2,t=inf,cnt=0,maxt=0;
int a[MAX],mat[MAX][MAX],v[MAX];
void dfs(int p,int end,int dis,int num)
{
if(p==end)
{
if(dis<t)
{
cnt=1;
t=dis;
maxt=num;
}
else if(dis==t)
{
cnt++;
if(maxt<num)maxt=num;
}
return;
}
if(dis>t)return;
for(int i=0;i<n;i++)
{
if(!v[i]&&mat[p][i]!=inf)
{
v[i]=1;
dfs(i,end,dis+mat[p][i],num+a[i]);
v[i]=0;
}
}
return;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&c1,&c2);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
v[i]=0;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
mat[i][j]=inf;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(z<mat[x][y])mat[x][y]=mat[y][x]=z;
}
dfs(c1,c2,0,a[c1]);
printf("%d %d",cnt,maxt);
return 0;
}