原题链接CSP 201903-5 317号子任务
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAX=10010;
const int INF=1e8;
int n,m,k;
int f[MAX];
struct node
{
int v,w;
node(int _v,int _w)
{
v=_v;
w=_w;
}
};
vector<int> x[MAX];
vector<node> g[MAX];
int d[MAX];
int vis[MAX];
void dijk(int s)
{
fill(d,d+MAX,INF);
memset(vis,0,sizeof(vis));
d[s]=0;
for(int i=1;i<=n;i++)
{
int u=-1;
int MIN=INF;
for(int j=1;j<=n;j++)
{
if(vis[j]==0 && d[j]<MIN)
{
u=j;
MIN=d[j];
}
}
if(u==-1)
return ;
vis[u]=1;
for(int j=0;j<g[u].size();j++)
{
int v=g[u][j].v;
if(vis[v]==0 && d[u]+g[u][j].w<d[v])
{
d[v]=d[u]+g[u][j].w;
}
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
cin>>f[i];
}
while(m--)
{
int u,v,w;
cin>>u>>v>>w;
g[u].push_back(node(v,w));
g[v].push_back(node(u,w));
}
for(int i=1;i<=n;i++)
{
dijk(i);
ll sum=INF;
for(int j=1;j<=n;j++)
{
if(f[j]==1 && d[j]!=INF)
x[i].push_back(d[j]);
}
sort(x[i].begin(),x[i].end());
ll tmp=0;
if(x[i].size()>=k)
{
for(int j=0;j<k;j++)
{
tmp+=x[i][j];
}
}
else
{
for(int j=0;j<x[i].size();j++)
{
tmp+=x[i][j];
}
}
sum=min(sum,tmp);
cout<<sum<<endl;
}
return 0;
}