dijkstra模板(优先队列+链式前向星)
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=2e3+10;
int head[maxn],cnt;
struct Edge{
int to,next,w;
}edge[maxn];
void add_Edge(int u,int v,int w){
edge[cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void init(){
memset(head,-1,sizeof head);
cnt=0;
}
struct s_node{
int id,n_dis;
s_node(int b,int c){id=b;n_dis=c;}
friend bool operator<(const s_node &a,const s_node &b)
{return a.n_dis>b.n_dis;}
};
int n,m,pre[maxn];
void print_path(int s,int t){
if(s==t){
printf("%d",s);
return;
}
print_path(s,pre[t]);
printf("%d",t);
}
void dijkstra(){
int s=1;
int dis[maxn];
bool done[maxn];
for(int i=1;i<=n;++i) {dis[i]=INF;done[i]=false;}
dis[s]=0;
priority_queue<s_node>que;
que.push(s_node(s,dis[s]));
while(!que.empty()){
s_node u=que.top();
que.pop();
if(done[u.id]) continue;
done[u.id]=true;
for(int i=head[u.id];~i;i=edge[i].next){
Edge y=edge[i];
if(done[y.to]) continue;
if(dis[y.to]>y.w+u.n_dis){
dis[y.to]=y.w+u.n_dis;
que.push(s_node(y.to,dis[y.to]));
pre[y.to]=u.id;
}
}
}
print_path(s,n);
}
int main(void){
while(~scanf("%d %d",&n,&m)){
if(n==0&&m==0) return 0;
init();
while(m--){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
add_Edge(a,b,c);
add_Edge(b,a,c);
}
dijkstra();
}
return 0;
}