#include <bits/stdc++.h>
#define pi acos(-1.0)
#define ll long long
#define ull unsigned long long
#define esp 1e-9
#define inf 0x3f3f3f3f
#define inff 0x3f3f3f3f3f3f3f3f
#define Pair pair<ll, ll>
#define It list<node>::iterator
using namespace std;
const ll N = 1e3+5;
struct node{
ll u, v, dis;
};
struct HeapNode{
ll dis, u;
bool operator < (const HeapNode &rhs) const{
return dis > rhs.dis;
}
};
struct Dijkstra{ //将迪杰斯特拉封装在一个结构体中,
ll n, dis[N], pre[N], vis[N];
vector<ll> G[N];
vector<node> edge;
void init(ll n){
this->n = n; edge.clear();
for (ll i = 0; i <= n; i++){
G[i].clear();
}
}
void add(ll u, ll v, ll dis){
edge.push_back((node){u, v, dis});
G[u].push_back(edge.size()-1);
}
void solve(ll s){
//构建一个以S为起点的迪杰斯特拉算法,就可以知道s到任意一点的距离
priority_queue<HeapNode> que;
memset(vis, 0, sizeof(vis));
for (ll i = 0; i <= n; i++){
dis[i] = inff;
}
dis[s] = 0;
que.push((HeapNode){0, s});
while (!que.empty()){
HeapNode x = que.top(); que.pop();
ll u = x.u;
if (!vis[u]){
vis[u] = true;
for (ll i = 0; i < G[u].size(); i++){
node &e = edge[G[u][i]];
if (dis[e.v] > dis[u]+e.dis){
dis[e.v] = dis[u]+e.dis;
pre[e.v] = G[u][i];
que.push((HeapNode){dis[e.v], e.v});
}
}
}
}
}
};
Dijkstra dij;//定义一个对象完成操作;
int main(){
ios::sync_with_stdio(false);
int n, m, u, v, w;
cin>>n>>m; //n为顶点数,m 为边数
dij.init(n);
for(int i = 1; i <= m; ++i)
{
cin>>u>>v>>w; //u,v顶点,w权值;
dij.add(u, v, w);
dij.add(v,u,w);//无向图;
}
dij.solve(1); //以1为起点,就是所有计算出来1到所有点的距离。
for(int i = 1; i <= n; ++i)
{
cout<<dij.dis[i]<<" ";
}
cout<<endl;
return 0;
}
迪杰斯特拉(模板)
最新推荐文章于 2021-08-16 19:40:34 发布
7204

被折叠的 条评论
为什么被折叠?



