站外题求助
  • 板块学术版
  • 楼主Ian_NIE
  • 当前回复2
  • 已保存回复3
  • 发布时间2024/3/29 15:32
  • 上次更新2024/3/29 18:52:11
查看原帖
站外题求助
602171
Ian_NIE楼主2024/3/29 15:32

代码:

#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;
}

样例都过不了,谢谢

2024/3/29 15:32
加载中...