/*
A3276 317号任务
CSP 16th T5
SPFA 需要手写队列
*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 10010, M = 20010, INF = 0x3f;
int n, m, k, type[N];
int a[N], v[M], w[M], nex[M], tot;
int dis[N], dist[N][1010], cnt;
bool inq[N];
int q[N];
void addEdge(int from, int to, int val){
v[++tot] = to, w[tot] = val, nex[tot] = a[from], a[from] = tot;
}
bool cmp(int a, int b) {
return a < b;
}
void spfa(int st)
{
int hh = 0, tt = 1;
memset(dis, INF, sizeof dis);
memset(inq, 0, sizeof inq);
q[0] = st;
inq[st] = true;
dis[st] = 0;
while (hh != tt)
{
//int u = q.front();
// q.pop();
int u = q[hh++];
if (hh == N) hh = 0;
inq[u] = false;
for (int i=a[u]; i; i=nex[i]) {
int j = v[i];
if (dis[u] + w[i] < dis[j]) {
dis[j] = dis[u] + w[i];
if (!inq[j]) {
// q.push(j);
q[tt++] = j;
if (tt == N) tt = 0;
inq[j] = true;
}
}
}
}
for (int i=1; i<=n; i++) dist[i][cnt] = dis[i];
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
for (int i=1; i<=n; i++) scanf("%d", &type[i]);
for (int i=1; i<=m; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
addEdge(a, b, c), addEdge(b, a, c);
}
// memset(dist, INF, sizeof dist);
for (int i=1; i<=n; i++)
if (type[i]) {
spfa(i);
cnt++;
}
// cout << 0x3f3f3f3f << endl;
for (int i=1; i<=n; i++) {
int res = 0;
sort(dist[i], dist[i] + cnt, cmp);
// for (int j=0; j<cnt && j < k; j++) cout << dist[i][j] << ' ';
// cout << endl;
for (int j=0; j<cnt && j<k; j++)
if (dist[i][j] != 0x3f3f3f3f) res += dist[i][j];
else break;
cout << res << endl;
}
return 0;
}
CSP 12th T4 行车路线
最新推荐文章于 2025-04-09 15:07:49 发布