您的位置:首页 > 其它

Dijkstra 算法最短路模板

2017-04-10 22:28 417 查看
Dijkstra 算法
从单个源点出发,到所有节点的最短路
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#define maxn 100
#define INF 100000
using namespace std;
struct Edge{
int from,to,dis;
Edge(int u,int v,int d):from(u),to(v),dis(d){}
};
struct HeapNode{//最小d值和对应的结点编号
int d,u;
bool operator <(const HeapNode &rhs) const{
return d>rhs.d;
}
};
struct Dijkstra{
int n,m;
vector<Edge> edge;//存放图中各条边的情况
vector<int> G[maxn];//从G[u]出发对应的边的编号,方便寻找到各边
bool done[maxn];//是否已访问
int d[maxn];//源点到各边的情况
int p[maxn];//最短路中的一条边
void init(int n){//初始化
this->n=n;
for(int i=0;i<n;i++)  G[i].clear();
edge.clear();
}
void AddEdge(int from,int to,int dis){//添加边
edge.push_back(Edge(from,to,dis));//如果是无向图,需要调用两次
m=edge.size();
G[from].push_back(m-1);
}
void dijkstra(int s){//求s到所有点的距离
priority_queue<HeapNode> Q;
for(int i=0;i<n;i++) d[i]=INF;
d[s]=0;
memset(done,0,sizeof(done));
Q.push(HeapNode{0,s});
while(!Q.empty()){
HeapNode x=Q.top();Q.pop();
int u=x.u;
if(done[u]) continue;
done[u]=true;
for(int i=0;i<G[u].size();i++){
Edge &e=edge[G[u][i]];
if(d[e.to]>d[u]+e.dis){
d[e.to]=d[u]+e.dis;
p[e.to]=G[u][i];
Q.push(HeapNode{d[e.to],e.to});
}
}
}
}

};
int main(){
int n,m;
scanf("%d%d",&n,&m);
Dijkstra dt;
dt.init(n);
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
dt.AddEdge(a,b,c);
}
dt.dijkstra(0);
for(int i=0;i<n;i++){
cout<<dt.d[i]<<endl;
}

return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: