//基于邻接矩阵的Dijkstra算法
//基于优先队列的Dijkstra算法
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
//思路:从一个节点到另外一个节点的最短路一定有中间节点贡献中间边,添加这些中间边比较发现最短路
//基于邻接矩阵的Dijkstra算法
const int maxn=10000;
int G[maxn][maxn];
int done[maxn],d[maxn];
int n,begin,end;
void Dijkstra(){
memset(done,0,sizeof(done));
for(int i=0;i<n;i++)
i==begin?d[i]=0:d[i]=0x3f3f3f3f;
for(int i=0;i<n;i++){//迭代n次取到每个节点
int x,y=0x3f3f3f3f;
for(int z=0;z<n;z++)if(!done[z]&&d[z]<=y)
y=d[x=z];
done[x]=1;
for(int z=0;z<n;z++){//观察x到z节点添加了x到z的边之后能不能让z到起点的距离变小
d[z]=min(d[z],d[x]+G[x][z]);
}
}
}
int main(){
cout<<"The nodes and edges"<<endl;
cin>>n>>m;
cout<<"The begin and the end"<<endl;
cin>>begin>>end;
cout<<"The Graph"<<endl;
memset(G,0x3f3f3f3f,sizeof(G));
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b>>G[a][b];
G[b][a]=G[a][b];
}
Dijkstra();
for(int i=0;i<n;i++)printf("%d ",d[i]);
return 0;
}
//基于优先队列的Dijkstra算法
//基于优先队列的Dijkstra算法
//思路:添加x到y的一条边看能够让 to节点到起点的距离更近;即是松弛操作
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=10000;
int n,m,beg,end1;
struct Node{
int from,to,len;
};
struct Edge{//这个必须要,保证每次在没有被访问过的节点中找到最小d[i]
int d,u;
bool operator <(const Edge& rhs)const{
return d>rhs.d;
}
};
vector<Node> node;
vector<int> G[maxn];
int v[maxn],d[maxn];
void Dijkstra(){
memset(v,0,sizeof(v));
for(int i=0;i<n;i++)
i==beg?d[i]=0:d[i]=0x3f3f3f3f;
priority_queue<Edge> que;
que.push(Edge{0,beg});
while(que.size()){
Edge e=que.top();que.pop();
printf("%d %d Test\n",e.d,e.u);
if(v[e.u])continue;
v[e.u]=1;
for(int i=0;i<G[e.u].size();i++){
Node nd=node[G[e.u][i]];
if(d[nd.to]>d[nd.from]+nd.len){
d[nd.to]=d[nd.from]+nd.len;
que.push(Edge{d[nd.to],nd.to});//取d[i]最小的
}
}
}
}
int main(){
cout<<"The n nodes and m edges,begin and end"<<endl;
cin>>n>>m>>beg>>end1;
cout<<"The m edges"<<endl;
for(int i=0;i<m;i++){
int x,y,w;
cin>>x>>y>>w;
node.push_back(Node{x,y,w});
G[x].push_back(node.size()-1);
}
// cout<<G[0][0]<<" "<<G[0][1]<<" "<<G[1][0]<<" "<<G[2][0]<<endl;
Dijkstra();
for(int i=0;i<n;i++)printf("%d ",d[i]);
return 0;
}