提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、Dijkstra
这是一个非常常用来处理正权图的一个算法,一般不用来处理有负权的图0。可以使用链式前向星来优化。
1、时间复杂度
n的平方;
2.算法模板
void DJ(int s)
{
for(int i=1;i<=n;i++) dis[i]=INF,vis[i] = false;
dis[s]=0;
for(int i=1;i<=n;i++){
int t=-1;
for(int j=1;j<=n;j++)
if(!vis[j]&&(t==-1||dis[j]<dis[t]))
t=j;
if(t==-1) return ;
vis[t] = true;
for(int j=1;j<=n;j++){
dis[j] = min(dis[j],dis[t]+f[t][j]);
}
}
}
3.DJ的堆优化
void DJ(int s)
{
for(int i=1;i<=n;i++) dis[i]=INF,vis[i] = false;
dis[s]=0;
priority_queue<PII,vector<PII>,greater<PII> > q;//建立一个小顶堆
q.push({0,s});
while(!q.empty())
{
int t = q.top().second;
q.pop();
if(vis[t]) continue;
vis[t] =true;
for(int i=0,l=E[t].size();i<l;i++)
{
int j = E[t][i].first,w = E[t][i].second;
if(dis[j]>dis[t]+w)
{
dis[j]=dis[t]+w;
q.push({dis[j],j});
}
}
}
}
二.关于最短路的一些例题
https://ac.nowcoder.com/acm/contest/27274/E
这是一道很简单的一道最短路的模拟题,主要是练习模板,这道题数据给的很水,每个个方法都可以解决这道题。我就只用一个方法来解决,我用的DJ的堆优化。
#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
const int INF = 0x3f3f3f3f;
const int N = 1e3+10;
int n,m,s,t;
int dis[N];
bool vis[N];
int f[N][N];
vector <PII> E[N];
void DJ(int s)
{
for(int i=1;i<=n;i++) dis[i]=INF,vis[i] = false;
dis[s]=0;
priority_queue<PII,vector<PII>,greater<PII> > q;
q.push({0,s});
while(!q.empty())
{
int t = q.top().second;
q.pop();
if(vis[t]) continue;
vis[t] =true;
for(int i=0,l=E[t].size();i<l;i++)
{
int j = E[t][i].first,w = E[t][i].second;
if(dis[j]>dis[t]+w)
{
dis[j]=dis[t]+w;
q.push({dis[j],j});
// cout<<1<<endl;
}
}
}
}
int main()
{
cin>>n>>m>>s>>t;
while(m--)
{
int u,v,w;
cin>>u>>v>>w;
E[u].push_back({v,w});
E[v].push_back({u,w});
}
DJ(s);
if(dis[t]>INF/2) cout<<"-1"<<endl;
else cout<<dis[t]<<endl;
return 0;
}
题目详情 - 单源最短路 - 追梦算法网 (mangata.ltd)
这道题题也是也是比较基础的一道最短路,但是要注意数据,防止t了,我用的bellam_ford来写的。
#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
const int INF = 0x3f3f3f3f;
const int N = 1e3+10;
int n,m,s,t;
int dis[N];
bool vis[N];
int f[N][N];
struct ma
{
int u,v,w;
};
vector <ma> E;
void bellman_ford(int s)
{
for(int i=1;i<=n;i++) dis[i] = INF;
dis[s] = 0;
for(int i = 1;i<=n;i++)
{
for(int j =0;j< 2 * m;j++)
{
int v =E[j].v,u = E[j].u,w=E[j].w;
if(dis[v] > dis[u]+w) dis [v] = dis[u]+w;
}
}
}
int main()
{
cin>>n>>m>>s>>t;
int tt = m;
while(tt--)
{
int u,v,w;
cin>>u>>v>>w;
E.push_back({u,v,w});
E.push_back({v,u,w});
}
bellman_ford(s);
cout<<dis[t]<<endl;
return 0;
}