普通版本:
#include <bits/stdc++.h> using namespace std; const int maxx=0x3f3f3f3f; int mp[150][150]; int dis[150]; bool vis[150]; int nodenum,edgenom; int dijkstra(int scr,int des) { memset(vis,0,sizeof(vis)); for(int i=1;i<=nodenum;++i) { dis[i]=mp[scr][i]; } dis[scr]=0; vis[scr]=1; for(int i=1;i<=nodenum;i++) { int tmp=maxx; int k; for(int j=1;j<=nodenum;j++) { if(!vis[j]&&tmp>dis[j]) { tmp=dis[j]; k=j; } } if(tmp==maxx) { break; } vis[k]=1; for(int j=1;j<=nodenum;j++) { if(!vis[j]&&dis[j]>dis[k]+mp[k][j]) { dis[j]=dis[k]+mp[k][j]; } } } return dis[des]; } int main() { int start,endd,cost; while(scanf("%d %d",&nodenum,&edgenom)&&(nodenum+edgenom)) { for(int i=1;i<=nodenum;++i) { for(int j=1;j<=nodenum;++j) { mp[i][j]=maxx; } } for(int i=1;i<=edgenom;++i) { scanf("%d %d %d",&start,&endd,&cost); mp[start][endd]=min(mp[start][endd],cost); mp[endd][start]=min(mp[endd][start],cost); } cout<<dijkstra(1,nodenum)<<'\n'; } return 0; }
链式前向星+优先队列
#include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; const int maxn=30000; int head[maxn]; bool vis[150]; int dis[150]; int nodenum,edgenom,tot; struct edge { int u,v,l,next; }t[maxn]; struct A { int pos,cost; bool operator < (const A &a)const{ return cost>a.cost; } }; void addedge(int x,int y,int z) { t[tot].u=x; t[tot].v=y; t[tot].l=z; t[tot].next=head[x]; head[x]=tot++; } int dijkstra(int src,int des)///scorce,destination { memset(dis,INF,sizeof(dis)); memset(vis,0,sizeof(vis)); priority_queue<A>q; dis[src]=0; A now; now.cost=0; now.pos=src; q.push(now); while(!q.empty()) { now=q.top(); q.pop(); if(vis[now.pos]) { continue; } vis[now.pos]=1; for(int i=head[now.pos];~i;i=t[i].next) { int to=t[i].v; if(!vis[to]&&dis[to]>t[i].l+dis[t[i].u])///src到k点的距离+k点到可更新点的距离<dis[可更新点] { dis[to]=dis[t[i].u]+t[i].l; now.cost=dis[to]; now.pos=to; q.push(now); } } } return dis[des]; } int main() { int start,endd,cost; while(scanf("%d %d",&nodenum,&edgenom)&&(nodenum+edgenom)) { tot=0; memset(head,-1,sizeof(head)); for(int i=1;i<=edgenom;++i) { scanf("%d %d %d",&start,&endd,&cost); addedge(start,endd,cost); addedge(endd,start,cost); } // for(int i=0;i<tot;i++) // { // cout<<t[i].u<<' '<<t[i].v<<' '<<t[i].l<<'\n'; // } cout<<dijkstra(1,nodenum)<<'\n'; } return 0; }