代码:
邻接表+优先队列实现
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
struct edge{
int to,w;
edge(int a,int b) {to=a;w=b;}
};
vector<edge>e[105];
struct node{
int id,dis;
node(int a,int b){id=a;dis=b;}
bool operator<(const node&a ) const
{return dis>a.dis;}
};
int n,m;
int pre[105]; //记录前驱结点
void print(int s,int t) {
if(s==t) {printf("%d ",s); return;}//打印起点
print(s,pre[t]);//先打印前一个点
printf("%d ",t);//后打印当前点,最后打印的是终点t
}//打印从s到t的最短路径
void dijkstra() {
int s=1; //起点是1
int dis[105];//记录所有结点到起点的距离
bool done[105];//done[i]=true表示到结点i的最短路径已经找到
for(int i=1;i<=n;++i) {
dis[i]=inf; done[i]=false;
}
dis[s]=0; //起点到自己的距离是0
priority_queue<node>q;//优先队列,存结点的信息
q.push(node(s,dis[s]));//起点进栈
while(!q.empty()) {
node u=q.top();
q.pop();
if(done[u.id]) continue;//丢弃已经找到最短路径的结点,即集合A中的结点
done[u.id]=true;
for(int i=0;i<e[u.id].size();++i) {
edge y=e[u.id][i]; //u.id的第i个邻居是y.to
if(done[y.to]) continue;//丢弃已经找到最短路径的邻居结点
if(dis[y.to]>y.w+u.dis) {
dis[y.to]=y.w+u.dis;
q.push(node(y.to,dis[y.to]));//扩展新的邻居,放到优先队列中
pre[y.to]=u.id;//如有需要,打印路径
}
}//检查结点u的所有邻居
}
printf("%d\n",dis[n]);
//print_path(s,n);
}
int main() {
while(~scanf("%d%d",&n,&m)) {
if(!n&&!m) return 0;
for(int i=1;i<=n;++i) e[i].clear();
while(m--) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
e[a].push_back(edge(b,c));
e[b].push_back(edge(a,c));
}
dijkstra();
}
} 
京公网安备 11010502036488号