弱者求救
查看原帖
弱者求救
920632
11chun_STAR楼主2025/7/2 14:33

大佬们,帮忙改一下优先队列优化吧,写不来重载运算符 算法为dij arr存储的是每个点所连的边 krr存储的是该点是否访问过 lrr存储的是所用路程。

#include <bits/stdc++.h>

using namespace std;

int n, m, s = 0;
struct node
{
	queue <int> len;
	queue <int> to;
}arr[10005];
int krr[10005] = {};
int lrr[10005] = {};
queue <int> brr;
int main()
{

	cin >> n >> m >> s;
	int u, v, w = 0;
    for(int i = 1; i <= n; i++)
    {
        lrr[i] = 2147483646;
    }
    lrr[s] = 0;
	for(int i = 1; i <= m; i++)
	{
		cin >> u >> v >> w;
		arr[u].len.push(w);
		arr[u].to.push(v);
	}
	int flag = 0;
    while(flag == 0)
    {
        int min = 2147483646, bj = -1;
        for(int i = 1; i <= n; i++)
        {
            if(krr[i] == 0 && lrr[i] < min)
            {
                bj = i;
                min = lrr[i];
            }
        }
        if(bj == -1)
        {
            flag = 1;
            continue;
        }
        krr[bj] = 1;
        int dx = arr[bj].len.size();
        for(int i = 1; i <= dx; i++)
        {
            int cd = arr[bj].len.front();
            int top = arr[bj].to.front();
            arr[bj].len.pop();
            arr[bj].to.pop();
            int op = 0;
            if(lrr[top] <= lrr[bj] + cd)
            {
                op = lrr[top];
            }
            else
            {
                op = lrr[bj] + cd;
            }
            lrr[top] = op;
        }
    }
    long long jg = pow(2,31) - 1;
    for(int i = 1; i <= n; i++)
    {
        if(lrr[i] == 2147483646)
        {
			cout << jg << ' ';
		}
		else
		{
			cout << lrr[i] << ' ';
		}
    }
	return 0;
}
2025/7/2 14:33
加载中...