
代码:
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int n, m, k, x, y, z, a[55], dis[5005];
vector<int> g[5005], w[5005];
bool vis[5005];
struct node
{
int pos, dis;
};
bool operator>(node x, node y)
{
return x.dis > y.dis;
}
priority_queue<node, vector<node>, greater<node>> q;
void dijkstra(int s)
{
memset(dis, 0x3f, sizeof dis), memset(vis, false, sizeof vis);
for(int i = 1; i <= k; i++) dis[i] = a[i];
q.push(node{s, a[s]});
while(!q.empty())
{
int u = q.top().pos;
q.pop();
if(vis[u]) continue;
vis[u] = true;
for(int i = 0; i < g[u].size(); i++)
{
int v = g[u][i];
if(v <= k) // 重要城市
{
if(dis[v] > dis[u] + w[u][i] + a[i])
{
dis[v] = dis[u] + w[u][i] + a[i];
if(!vis[v]) q.push(node{v, dis[v]});
}
}
else if(dis[v] > dis[u] + w[u][i])
{
dis[v] = dis[u] + w[u][i];
if(!vis[v]) q.push(node{v, dis[v]});
}
}
}
return ;
}
int main()
{
cin >> n >> m >> k;
for(int i = 1; i <= k; i++) cin >> a[i];
for(int i = 1; i <= m; i++)
{
cin >> x >> y >> z;
g[x].push_back(y);
w[x].push_back(z);
g[y].push_back(x);
w[y].push_back(z);
}
int mind = 2e9, pos;
for(int i = 1; i <= k; i++)
{
dijkstra(i);
int maxd = 0;
for(int j = 1; j <= k; j++)
maxd = max(maxd, dis[j]);
if(i == 1)
{
for(int j = 1; j <= n; j++)
cout << dis[i] << ' ';
cout << endl;
}
if(mind > maxd) mind = maxd, pos = i;
}
cout << pos << ' ' << mind << endl;
return 0;
}
样例都过不了,谢谢