用小顶堆优化的,结果一直出问题。。。
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct jie
{
int zi,qu;
};
vector <jie>tu[100005];
int ji[100005],dis[100005],ha[100005],dui[100005],z=0;
void add(int x)
{
if (z == 0)
{
z++;
dui[z]=x;
return;
}
z++;
dui[z]=x;
int fz=z;
while (fz > 1 and dis[dui[fz/2]] > dis[dui[fz]])
{
swap(dui[fz/2],dui[fz]);
fz/=2;
}
return;
}
void shan()
{
if (z == 0)
{
return;
}
swap(dui[1],dui[z]);
z--;
int fh=1;
while (1)
{
// cout << "sssl";
if (fh*2+1 <= z)
{
if (dis[dui[fh*2+1]] > dis[dui[fh*2]])
{
if (dis[dui[fh]] > dis[dui[fh*2]])
{
swap(dui[fh],dui[fh*2]);
fh=fh*2;
}
else
{
break;
}
}
else
{
if (dis[dui[fh]] > dis[dui[fh*2+1]])
{
swap(dui[fh],dui[fh*2+1]);
fh=fh*2+1;
}
else
{
break;
}
}
}
else if (fh*2 <= z)
{
if (dis[dui[fh]] > dis[dui[fh*2]])
{
swap(dui[fh],dui[fh*2]);
fh=fh*2;
}
else
{
break;
}
}
else
{
break;
}
}
return;
}
int cha()
{
while (ha[dui[1]] == 1 and z > 0)
{
//cout << "sisis";
shan();
}
if (z > 0)
{
int ff=dui[1];
shan();
return ff;
}
}
signed main()
{
//freopen("P4779_1.in","r",stdin);
//freopen("P4779_1.out","w",stdout);
int n,m,s,u,v,w;
cin >> n >> m >> s;
for (int i = 1;i <= n;i++)
{
dis[i]=LLONG_MAX;
tu[i].push_back({0,0});
}
for (int i = 1;i <= m;i++)
{
cin >> u >> v >> w;
tu[u].push_back({v,w});
ji[u]++;
}
ha[s]=1;
int fz=s,hao;
dis[s]=0;
for (int i = 1;i < n;i++)
{
for (int j = 1;j <= ji[fz];j++)
{
if (ha[tu[fz][j].zi] == 0)
{
//dis[tu[fz][j].zi]=min(dis[tu[fz][j].zi],dis[fz]+tu[fz][j].qu);
if (dis[tu[fz][j].zi] > dis[fz]+tu[fz][j].qu)
{
dis[tu[fz][j].zi]=dis[fz]+tu[fz][j].qu;//cout << 66;
add(tu[fz][j].zi);
}
}
//cout << dis[tu[fz][j].zi] << " ";
}
//int minn=LLONG_MAX;
/*for (int j = 1;j <= n;j++)
{
if (dis[j] < minn and ha[j] == 0)
{
minn=dis[j];
hao=j;//;
}
}*/
hao=cha();
ha[hao]=1;
fz=hao;
}
for (int i = 1;i <= n;i++)
{
cout << dis[i] << " ";
}
return 0;
}
堆里存的是每个点的标号