注意点:
一个单源最短路算法,需要考虑两个条件,最短路和最多队伍,有优先级。用spfa。
代码:
#include <iostream>
#define max_Int 1<<30
using namespace std;
struct Road{
int d;
int l;
};
struct Line{
int p;
int l;
int t;
};
int main()
{
int n, m, c1, c2;
int team[500];
struct Road road[501][501];
struct Line line[100000];
int con[500];
int left, right;
int i, j, i1, i2, i3, i4;
int num, ans, minl;
cin >> n >> m >> c1 >> c2;
for (i = 0; i < n; i++)
{
cin >> team[i];
road[i][0].d = 0;
con[i] = max_Int;
}
for (i = 0; i < m; i++)
{
cin >> i1 >> i2 >> i3;
road[i1][0].d++;
i4 = road[i1][0].d;
road[i1][i4].d = i2;
road[i1][i4].l = i3;
road[i2][0].d++;
i4 = road[i2][0].d;
road[i2][i4].d = i1;
road[i2][i4].l = i3;
}
left = 0; right = 0;
con[c1] = 0;
line[0].p = c1;
line[0].l = 0;
line[0].t = team[c1];
while (left <= right)
{
if (line[left].l > con[line[left].p])
{
left++;
continue;
}
for (i = 1; i <= road[line[left].p][0].d; i++)
{
if (line[left].l + road[line[left].p][i].l > con[road[line[left].p][i].d])
{
continue;
}
else
{
con[road[line[left].p][i].d] = line[left].l + road[line[left].p][i].l;
right++;
line[right].p = road[line[left].p][i].d;
line[right].l = con[road[line[left].p][i].d];
line[right].t = line[left].t + team[road[line[left].p][i].d];
}
}
left++;
}
minl = con[c2];
ans = 0;
num = 0;
for (i = 0; i <= right; i++)
{
if (line[i].p == c2 && line[i].l == minl)
{
num++;
if (line[i].t > ans)
ans = line[i].t;
}
}
cout << num << " " << ans << endl;
return 0;
}