算法原理部分在这就不多说了,其思想就是以起始点为中心向外层层扩展,直到扩展到终点为止。
该算法要求图中不存在负权边。
模板如下:
s【】表示该点是否已经计算出对应的dist【】, 是为true,否则为false;
dist【i】表示起始点到i点的距离;
ans【i】【j】表示点i到点j的距离,如果i,j不相邻,则为无穷大;
#define INF 999999999 #define MAX 10005 using namespace std; bool s[MAX]; int dist[MAX],ans[MAX][MAX]; void Dijkstra(int n,int v)//传入顶点数n和起始点v { int newdist,temp,u,i,j; for(i=1;i<=n;i++) { dist[i]=ans[v][i]; s[i]=false; } dist[v]=0; s[v]=true; for(i=2;i<=n;i++) { temp=INF; u=v; for(j=1;j<=n;j++) if((!s[j])&&(dist[j]<temp)) { u=j; temp=dist[j]; } s[u]=true; for(j=1;j<=n;j++) if((!s[j])&&(ans[u][j]<INF)) { newdist=dist[u]+ans[u][j]; if(newdist<dist[j]) dist[j]=newdist; } } }
HDU2544 最短路:
#include <cstdio> #include <iostream> #define INF 999999999 #define MAX 10005 using namespace std; int s[MAX]; int dist[MAX],ans[MAX][MAX]; void Dijkstra(int n,int v) { int newdist,temp,u,i,j; for(i=1;i<=n;i++) { dist[i]=ans[v][i]; s[i]=0; } dist[v]=0; s[v]=1; for(i=1;i<=n;i++) { temp=INF; u=v; for(j=1;j<=n;j++) if((!s[j])&&(dist[j]<temp)) { u=j; temp=dist[j]; } s[u]=1; for(j=1;j<=n;j++) if((!s[j])&&(ans[u][j]<INF)) { newdist=dist[u]+ans[u][j]; if(newdist<dist[j]) dist[j]=newdist; } } } int main() { int m,n; int a,b,t; while(scanf("%d%d",&n,&m)) { if(m==0&&n==0) break; for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) ans[i][j]=INF; for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&t); ans[a][b]=t; ans[b][a]=t; } Dijkstra(n,1); printf("%d\n",dist[n]); } return 0; }