专栏文章
单元最短路(dijkstra)模板
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqfva7y
- 此快照首次捕获于
- 2025/12/04 04:07 3 个月前
- 此快照最后确认于
- 2025/12/04 04:07 3 个月前
代码
一,邻接矩阵储存法
CPP#include<bits/stdc++.h>
using namespace std;
int n,m,a[505][505],dis[505],k;
void dijkstra(int x)
{
int f[505];
memset(dis,0x3f,sizeof(dis));
memset(f,0,sizeof(f));
dis[x]=0;
for(int i=1;i<=n;i++)
{
int t=0;
for(int j=1;j<=n;j++)
{
if(f[j]==0&&dis[j]<dis[t])
{
t=j;
}
}
if(t==0)
{
return ;
}
f[t]=1;
for(int j=1;j<=n;j++)
{
if(dis[j]>dis[t]+a[t][j])
{
dis[j]=dis[t]+a[t][j];
}
}
}
return ;
}
int main()
{
cin>>n>>m>>k;
memset(a,0x3f,sizeof(a));
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
a[x][y]=min(a[x][y],z);
}
dijkstra(1);
if(dis[k]==0x3f3f3f3f)
{
cout<<-1;
}
else
{
cout<<dis[k];
}
return 0;
}
二,邻接表储存法
CPP#include<bits/stdc++.h>
using namespace std;
int n,m,k,head[100005],cnt,dis[100005];
struct abc
{
int to,size,next;
}a[100005];
void add(int x,int y,int z)
{
cnt++;
a[cnt].to=y;
a[cnt].next=head[x];
a[cnt].size=z;
head[x]=cnt;
return ;
}
void dijkstra(int x)
{
int f[100005];
memset(dis,0x3f,sizeof(dis));
memset(f,0,sizeof(f));
dis[x]=0;
for(int i=1;i<=n;i++)
{
int t=0;
for(int j=1;j<=n;j++)
{
if(f[j]==0&&dis[j]<dis[t])
{
t=j;
}
}
if(t==0)
{
return ;
}
f[t]=1;
for(int j=head[t];;j=a[j].next)
{
if(j==0)
{
break;
}
if(dis[a[j].to]>dis[t]+a[j].size)
{
dis[a[j].to]=dis[t]+a[j].size;
}
}
}
return ;
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
}
dijkstra(1);
if(dis[k]==0x3f3f3f3f)
{
cout<<-1;
}
else
{
cout<<dis[k];
}
return 0;
}
三,堆优化
CPP#include<bits/stdc++.h>
using namespace std;
int n,m,k,head[100005],cnt,dis[100005];
priority_queue< pair<int,int> ,vector< pair<int,int> >,greater< pair<int,int> > > q;
struct abc
{
int to,size,next;
}a[100005];
void add(int x,int y,int z)
{
cnt++;
a[cnt].to=y;
a[cnt].next=head[x];
a[cnt].size=z;
head[x]=cnt;
return ;
}
void dijkstra(int x)
{
int f[100005];
memset(dis,0x3f,sizeof(dis));
memset(f,0,sizeof(f));
dis[x]=0;
q.push({0,x});
while(!q.empty())
{
pair<int,int> t=q.top();
q.pop();
if(f[t.second]==1)
{
continue;
}
f[t.second]=1;
for(int i=head[t.second];;i=a[i].next)
{
if(i==0)
{
break;
}
if(dis[a[i].to]>t.first+a[i].size)
{
dis[a[i].to]=t.first+a[i].size;
q.push({dis[a[i].to],a[i].to});
}
}
}
return ;
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
}
dijkstra(1);
if(dis[k]==0x3f3f3f3f)
{
cout<<-1;
}
else
{
cout<<dis[k];
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...
