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;
}
View Code

相关文章: