注意最后输出的是最短路径的条数,不是距离。。。
用dfs解决
#include <iostream>
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
using namespace std;
int n,m,c1,c2;
int *rescueteam;
int **road;
int roadlen = INT_MAX;
int totalteam = 0;
int cnt;
void DFS(int start, int end, int team, int len, bool *visited)
{
if(len > roadlen)
return ;
if(start == end)
{
if(len < roadlen)
{
roadlen = len;
totalteam = team;
cnt = 1;
}
else if(len == roadlen)
{
if(team > totalteam)
totalteam = team;
cnt++;
}
return;
}
for(int i = 0; i < n; i++)
{
if(road[start][i] != INT_MAX && !visited[i])
{
visited[i] = true;
DFS(i,end,team + rescueteam[i], len + road[start][i], visited);
visited[i] = false;
}
}
}
int main()
{
bool *visited;
cin >> n >> m >> c1 >> c2;
rescueteam = new int[n];
visited = new bool[n];
road = (int **)malloc(sizeof(int *)*n);
for(int i = 0; i < n; i++)
{
cin >> rescueteam[i];
visited[i] = false;
road[i] = new int[n];
for(int j = 0; j < n; j++)
road[i][j] = INT_MAX;
}
int x,y;
for(int i = 0; i < m; i++)
{
cin >> x >> y;
cin >> road[x][y];
road[y][x] = road[x][y];
}
visited[c1] = true;
DFS(c1, c2, rescueteam[c1], 0, visited);
cout << cnt << " " << totalteam;
return 0;
}