洛谷P4779
Dijskra算法+堆优化,但是数据有点大,不能用邻接矩阵储存,用邻接表。
好了,其他也没什么可说的了。这篇题解呢,是大量利用STL的,要是看不懂STL的请移步至其他题解
//根据数据范围(以P4779为准,这个代码两题通用),我决定采用Dijskra的堆优化
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<list>
using namespace std;
struct Edge{
int to,len;
};
int n,m,s , u,v,w;
vector<list<Edge> > dis; //一看数据,邻接矩阵肯定Pass了,上邻接表(高级写法)
struct Dot{
int dist,t;
bool operator < (Dot a)const{
return dist>a.dist;
}
};
priority_queue<Dot> q;
vector<int>f; //离起点的最小距离
int tot;
int main(){
// freopen("testdata.in","r",stdin);
// freopen("testdata.out","w",stdout);
scanf("%d%d%d",&n,&m,&s);
dis.reserve(n+1);
f.reserve(n+1);
for(int i=0;i<=n;i++)
dis.push_back(list<Edge>());
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
if(u!=v) dis[u].push_back( {v,w} ); //数据有毒,有从a到a距离为??(>0)的这种东西造成死循环。。。
} //读入
for(int i=0;i<=n;i++)
f.push_back(2147483647);
q.push( Dot{0,s} );
tot=n; //初始化
for(;tot>0&&!q.empty();){ //必须要加!q.empty(),否则就会因为达不到的点卡死,tot是节省时间
Dot now=q.top(); q.pop();
if(f[now.t]<=now.dist) continue;
f[now.t]=now.dist; tot--;
for(list<Edge>::const_iterator i=dis[now.t].begin();i!=dis[now.t].end();i++)
q.push( Dot{now.dist+i->len,i->to} );
}
for(int i=1;i<n;i++) printf("%d ",f[i]); printf("%d\n",f[n]);
// fclose(stdin);
// fclose(stdout);
return 0;
}