您的位置:首页 > 其它

PAT-A 1003. Emergency (25)

2017-08-22 08:50 447 查看
注意点:

一个单源最短路算法,需要考虑两个条件,最短路和最多队伍,有优先级。用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: