题意:N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。A,B,X代表A,B间有一条权值为X的路(0<=A,B<N,A!=B,0<X<10000)
两个整数S,T(0<=S,T<N),分别代表起点和终点。求出从S到T的最短距离,如果数据不存在则输出-1
思路:使用优先队列存储的迪杰斯特拉算法 (模板题)
完整代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <queue> #include <cstring> const int inf = 0x3f3f3f3f; const int max_size = 205; const int max_edge = 1e3+5; using namespace std; typedef pair <int,int> pi; int head[max_size]; int dist[max_size]; int top,n,m; struct Edge{ int u,v,w,next; }edge[max_edge]; void init(){ memset(head,-1,sizeof(head)); memset(dist,inf,sizeof(dist)); top =0; } void add(int a,int b,int c){ edge[top].next = head[a]; edge[top].v = b; edge[top].u = a; edge[top].w = c; head[a] = top; top ++; } void dijkstra(int s,int e){ priority_queue<pi> Q; Q.push(make_pair(0,s));//自身这一组刚开始为0 dist[s] = 0; while(Q.size()){ int k = Q.top().second;//找到距离最小的点 Q.pop(); for(int i = head[k];~i;i = edge[i].next){ if(dist[edge[i].v] > dist[k]+edge[i].w){ dist[edge[i].v] = dist[k] + edge[i].w; Q.push(make_pair(-dist[edge[i].v],edge[i].v)); //由于queue是默认递增序列,所以每次取top即使取负数最大非负数最小的点 } } } } int main(){ while(cin>>n>>m){ init(); for(int i=0;i<m;i++){ int a,b,c; cin>>a>>b>>c; add(a,b,c); add(b,a,c); } int s,e; cin>>s>>e; dijkstra(s,e); if(dist[e]!=inf) cout<<dist[e]<<endl; else cout<<-1<<endl; } }