最短路

来源:互联网 发布:冰点还原 知乎 编辑:程序博客网 时间:2024/06/05 05:16

单源最短路问题就是求出图中源点到其它所有结点的最小距离。

Dijkstra算法每次找出距离源点最近的点,然后更新剩余所有点到源点的距离。

 

int n;  //顶点数int m;  //边数void init(){    int u,v,w;    for(int i=1; i<=n; i++)        for(int j=i; j<=n; j++)            G[i][j] = G[j][i] = INF;    for(int i=0; i<m; i++)    {        scanf("%d%d%d",&u,&v,&w);        G[u][v] = w;    }}void Dijkstra(int u){    int miin;    int v;    for(int i=1; i<=n; i++)    {        d[i] = INF;        vis[i] = 0;    }    /*初始化*/    for(int i=1; i<=m; i++)        d[i] = G[u][i];    vis[u] = 1;    d[u] = 0;    for(int i=1; i<n; i++)    //加入其他的n-1个结点    {        //寻找距离最近的结点        v = u;        miin = INF;        for(int j=1; j<=n; j++)        {            if(!vis[j] && d[j]<miin)            {                v = j;                miin = d[j];            }        }        vis[v] = 1;        //距离更新        for(int j=1; j<=n; j++)        {            if((!vis[j]) && G[v][j]<INF)            {                if(d[j]>d[v]+G[v][j])                {                    d[j] = d[v] + G[v][j];                }            }        }    }}


 Bellman-Ford算法对边进行松弛,参考了一个大神的博客。http://www.wutianqi.com/?p=1912。

typedef struct Edge{    int u,v;    int w;} Edge;Edge edge[maxn];int dist[maxn];int n; //结点数int m; //边数int p; //源点void init(){    scanf("%d%d%d",&n,&m,&p);    for(int i=0; i<=n; i++)        dist[i] = INF;    dist[p] = 0;    for(int i=0; i<m; i++)    {        scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);        if(edge[i].u == p) dist[edge[i].v] = edge[i].w;    }}void relax(int u,int v,int w){    if(dist[u] + w < dist[v])        dist[v] = dist[u] + w;}bool Bellman-Ford(){    for(int i=0; i<n-1; i++)        for(int j=0; j<m; j++)            relax(edge[j].u,edge[i].v,edge[i].w);    //判断是否有负环路    bool flag = 1;    for(int i=0; i<m; i++)        if(dist[edge[i].u]+dege[i].w<dist[dege[i].v])        {            flag = 0;            break;        }    return flag;}

Floyd算法的原理是动态规划。 假设Dist(u,v)代表u到v的最小距离,该路径可以是两个点直接相连,也可能中间经过好多点。对于所有的点k,看是否存在Dist(u,k)+Dist(k,v)<Dist(u,v),如果存在就更新。当便利万所有的k后,Dist(u,v)是最小的。

void Floyd(){    for(int k=0; k<n; k++)      for(int i=0; i<n; i++)         for(int j=0; j<n; j++)            dist[i][j] = min(dist[i][j],dist[i][k]+dist[k][j]);}

 

 

0 0
原创粉丝点击