dijkstra算法的堆优化,是用vector模拟邻接表来存储图的,是把第一个节点当的起始点,写完后自己一造数据发现错了,求助dl们帮忙找一下错误QAQ。
#include<vector>
#include<queue>
#include<iostream>
#include<cstdio>
using namespace std;
struct edgenode
{
int to;
int w;
};
struct node
{
int id;
int dis;
bool operator <(const node& x) const
{
return dis>x.dis;
}
};
vector<edgenode>gra[114514];
priority_queue<node> que;
int dist[114514];
bool vis[114514];
void add_edge(int u,int v,int w)
{
edgenode t;
t.to=v;
t.w=w;
gra[u].push_back(t);
}
void dijkstra()
{
dist[1]=0;
que.push((node){0,1});
while(!que.empty())
{
node temp=que.top();
que.pop();
int x=temp.id,d=temp.dis;
if(vis[x])
continue;
vis[x]=true;
for(int i=0;i<gra[x].size();i++)
{
int y=gra[x].at(i).to;
if(dist[y]>dist[x]+gra[x].at(i).w)
{
dist[y]=dist[x]+gra[x].at(i).w;
if(!vis[y])
que.push((node){dist[y],y});
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n,m,u,v,w;
cin>>n>>m;
for(int i=1;i<=n;i++)
dist[i]=0x7fffffff;
for(int i=1;i<=m;i++)
{
cin>>u>>v>>w;
if(u==1)
dist[v]=w;
add_edge(u,v,w);
}
dijkstra();
for( int i = 1; i <= n; i++ )
printf("%d ", dist[i]);
}