题意:N和M(0<N<200,0<M<1000),分别代表现有已修建的道路的数目和城镇的数目,城镇分别以0~M-1编号。接下来N条道路 A, B, X (0<=A,B<N,A!=B,0<X<10000) ,
两个整数S,T(0<=S,T<N),分别代表起点和终点。如果数据不存在则输出-1
思路:使用优先队列优化的迪杰斯特拉算法,由于输入中还有重边问题,用链式向前星(没有处理的情况下)就会有错,所以我们用vector存储的邻接表 来存储
完整代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define inf 0x3f3f3f3f
#define maxn 1010
using namespace std;
int dist[maxn],n,t;
struct edge
{
int to;
int cost;
};
vector<edge> g[maxn];//邻接表
typedef pair<int,int> pi;
void dijkstra(int s)
{
//通过指定greater<pi>参数,堆按照first从大到小的顺序取初值
priority_queue<pi,vector<pi>,greater<pi> > que;
memset(dist,inf,sizeof(dist));
dist[s]=0;
que.push(pi(0,s));
while(!que.empty())
{
pi p = que.top();
que.pop();
int v = p.second;//first是最短距离,second是顶点的编号
if(dist[v]<p.first) continue;
for(int i=0; i<g[v].size(); ++i)
{
edge e=g[v][i];
if(dist[e.to]>dist[v]+e.cost)//Dijkstra
{
dist[e.to]=dist[v]+e.cost;
que.push(pi(dist[e.to],e.to));
}
}
}
}
int main()
{
int a,b,l;
while(scanf("%d%d",&t,&n)!=EOF)
{
for(int i=0; i<t; i++)
{
scanf("%d%d%d",&a,&b,&l);
edge A; A.cost = l,A.to = b;
edge B; B.cost = l,B.to = a;
g[a].push_back(A);
g[b].push_back(B);
}
dijkstra(n);
printf("%d
",dist[1]);
}
return 0;
}