大佬们,帮忙改一下优先队列优化吧,写不来重载运算符 算法为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;
}