三种算法:
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种了吗?