震惊!最短路竟然有9种方法,背后的真相竟然是?男默女泪的背后究竟隐藏着什么?

三种算法:

Floyd:

复杂度O(n^3)

for (int k=1; k<=n; k++)
    for (int i=1; i<=n; i++)
        for (int j=1; j<=n; j++){
             mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
              }

Dijkstra:

复杂度:O(n^2)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 105;
const int INF= 0x3f3f3f3f;
const ll mod = 105;
struct node
{
    int to,val;
};
int m,n;
int qwe[maxn];				//qwe[i]起点到i的最短距离
int vis[maxn];				//记录点是否被访问过
void Dijkstra(int start)
{
    memset (vis,0,sizeof(vis));
    for (int i=1; i<=n; i++)
        qwe[i]=INF;
    qwe[start]=0;
    int minpos;
    for (int i=1; i<=n; i++)
    {
        minpos=-1;
        for (int j=1; j<=n; j++)
        {
            if (!vis[j])
                if (minpos==-1||qwe[j]<qwe[minpos])
                    minpos=j;
        }
        if (qwe[minpos]==INF)
            break;
        vis[minpos]=1;
        for (int j=0; j<mp[minpos].size(); j++)
			 qwe[mp[minpos][j].to]=min(qwe[mp[minpos][j].to],qwe[minpos]+mp[minpos][j].val);
    }
}

SPFA:

O(E)复杂度期望是边数

#define MT(a,b) memset(a,b,sizeof(a))
const int maxn=1E3+5;
const int ONF=-0x3f3f3f3f;
const int INF=0x3f3f3f3f;
bool qwe[maxn][maxn];
bool vis[maxn];
int d[maxn];
int SPFA (int start)
{
    int tmp;
    MT(vis, false);
    MT(d,INF);
    d[start]=0;
    queue<int>q;
    vis[start]= true;
    q.push(start);
    while (!q.empty())
    {
        tmp=q.front();
        q.pop();
        vis[tmp]= false;
        for (int i=1;i<=n;i++)
        {
            if (qwe[tmp][i]== true && d[i]>d[tmp]+1)
            {
                d[i]=d[tmp]+1;
                if (vis[i]== false)
                {
                    vis[i]= true;
                    q.push(i);
                }
            }
        }
    }
    return d[n];
}

三种储存数据的方式:

邻接矩阵:

int mp[maxn][maxn];

vector

struct node
{
    int to,val;
};
vector<node>mp[maxn];

链式向前星

struct node
{
    int  to,next,val;
} qwe[maxn<<1];
void operation (int a,int b,int c)
{
    qwe[cnt].to=b;
    qwe[cnt].next=head[a];
    qwe[cnt].val=c;
    head[a]=cnt++;
}

可能就会有小朋友问了,你这里只有三种啊。
嘻嘻,3*3不就9种了吗?

发布了33 篇原创文章 · 获赞 16 · 访问量 935

猜你喜欢

转载自blog.csdn.net/weixin_43925900/article/details/95924072