#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
const int maxn=100005;
struct node ///优先队列, 在距离相同时选最小花费
{
int u,v,w,dis;
node(int _v=0,int _w=0,int _dis=0):v(_v),w(_w),dis(_dis){}
bool operator <(const node &r)const
{
if(dis!=r.dis)
return dis>r.dis;
else
return w>r.w;
}
};
vector<node> vec[maxn];///存边
int vis[maxn];
int dis[maxn];///存最短路径
int pre[maxn];///存父节点
const int inf=0x3f3f3f3f;
int n,m,c;
void dij()
{
int load=0;///记录在最短路径的情况下,边权和
for(int i=1;i<=n;i++)
{
pre[i]=i;
vis[i]=0;
dis[i]=inf;
}
priority_queue<node> q;
dis[1]=0;
q.push(node(1,0,0));
node tmp;
while(!q.empty())
{
tmp=q.top();
q.pop();
int u=tmp.v;
if(vis[u])
continue;
load+=tmp.w;
vis[u]=1;
for(int i=0;i<vec[u].size();i++)
{
int v=vec[u][i].v;
int cost=vec[u][i].w;
if(!vis[v]&&dis[v]>=dis[u]+cost)
{
pre[v]=tmp.v;
dis[v]=dis[u]+cost;
q.push(node( v,cost,dis[v]));
}
}
}
for(int i=1;i<=n;i++)
printf("%d ",pre[i]);
printf("\n%d\n",load);
for(int i=1;i<=n;i++)
printf("%d ",dis[i]);
printf("\n");
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
vec[i].clear();
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
vec[u].push_back(node(v,w,0));
vec[v].push_back(node(u,w,0));
}
dij();
}
dijkstra-堆优化-功能全!!模板!!!
最新推荐文章于 2022-04-23 22:58:46 发布