社区讨论
dijkstra算法加堆优化,只过一个点
P3371【模板】单源最短路径(弱化版)参与者 6已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mi6henzs
- 此快照首次捕获于
- 2025/11/20 04:55 4 个月前
- 此快照最后确认于
- 2025/11/20 04:55 4 个月前
CPP
#include <iostream>
#include <vector>
using namespace std;
struct node
{
long cost,id;
};
vector <node> photo[10001];
long dist[10001];
long heap[10001];
long flag[10001];
int n,m,s;
int f,g,w;
long len;
void swap(int i,int j)
{
int temp;
temp=heap[i];
heap[i]=heap[j];
heap[j]=temp;
}
void up(int i)
{
if(i==1) return;
if(dist[heap[i]]<dist[heap[i/2]])
{
swap(i,i/2);
up(i/2);
}
}
void down(int i)
{
if(2*i>len) return;
int minn=2*i;
if(minn+1<=len&&dist[heap[minn]]>dist[heap[minn+1]])
{
minn=minn+1;
}
if(dist[heap[minn]]<dist[heap[i]])
{
swap(minn,i);
down(minn);
}
}
void getdata()
{
cin>>n>>m>>s;
node x;
for(int i=1;i<=m;i++)
{
cin>>f>>g>>w;
x.id=g;
x.cost=w;
photo[f].push_back(x);
}
}
void dijkstra()
{
for(int i=1;i<=n;i++)
{
flag[i]=0;
dist[i]=2147483647;
}
dist[s]=0;
flag[s]=1;
len=0;
for(int i=0;i<photo[s].size();i++)
{
int nxtv=photo[s][i].id;
long cost=photo[s][i].cost;
dist[nxtv]=cost;
heap[++len]=nxtv;
up(len);
}
for(int k=1;k<n;k++)
{
int temp;
while(len>0)
{
temp=heap[1];
swap(1,len);
len--;
down(1);
if(flag[temp]==0) break;
}
//if(flag[temp]==1) break;
flag[temp]=1;
for(int i=0;i<photo[temp].size();i++)
{
int nxtv=photo[temp][i].id;
long cost=photo[temp][i].cost;
if(dist[nxtv]>dist[temp]+cost)
{
dist[nxtv]=dist[temp]+cost;
heap[++len]=nxtv;
up(len);
}
}
}
}
int main()
{
getdata();
dijkstra();
for(int i=1;i<=n;i++)
cout<<dist[i]<<" ";
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...