Dijkstra:
裸的算法,O(n^2),使用邻接矩阵:
算法思想:
定义两个集合,一开始集合1只有一个源点,集合2有剩下的点。
STEP1:在集合2中找一个到源点距离最近的顶点k:min{d[k]}
STEP2:把顶点k加入集合1中,同时修改集合2中的剩余顶点j的d[j]是否经过k之后变短,若变短则修改d[j];
if d[k]+a[k,j]<d[j] then d[j]=d[k]+a[k,j];
STEP3:重复STEP1,直到集合2为空为止。
#include <iostream> #include <cstring> using namespace std; #define MAXINT 9999999 int minx,minj,x,y,t,k,n,m,tmp; int v[1000],d[1000],a[1000][1000]; int main() { cin>>n>>m>>k; memset(a,0,sizeof(a)); memset(d,MAXINT,sizeof(d)); memset(v,0,sizeof(v)); d[k]=0; for (int i=1;i<=m;i++) { cin>>x>>y>>t; a[x][y]=t; a[y][x]=t; } for (int i=1;i<=n-1;i++) { minx=MAXINT; for (int j=1;j<=n;j++) if ((v[j]==0)&&(d[j]<minx)) { minx=d[j]; minj=j; } v[minj]=1; for (int j=1;j<=n;j++) if ((v[j]==0)&&(a[minj][j]>0)) { tmp=d[minj]+a[minj][j]; if (tmp<d[j]) d[j]=tmp; } } for (int i=1;i<=n;i++) cout<<d[i]<<" "; cout<<endl; return 0; }