一个story:
2018.10.3,晚上,在与我校是竞争关系的学校的机房(去一起集训)训练。
于是我研究了一下dijkstra,哦哦哦,除了不能处理负权,还是很好用的,教练没有坑我!
在这里发一下STL堆优化的dijkstra,因为用负值处理,所以甚至不用写比较函数,代码自然比一般STL还要简洁,666
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<stack>
#include<set>
#include<map>
#include<cmath>
#include<list>
#include<cstring>
#include <climits>//bei
using namespace std;
priority_queue< pair<int,int> > q;
long long cnt=0,dis[1000000],vis[1000000],hand[1000000],n,m,g;
struct aa//静态邻接表,好写又不占太多空间,抱走了
{
int to,next,w;
};
aa xx[10000000];
inline void djstl()
{
for(int i=1;i<=n;i++)
dis[i]=2147483647;
q.push(make_pair(0,g));dis[g]=0;
while(!q.empty())
{
int now=q.top().second;
q.pop();
if(vis[now]==1) continue;
vis[now]=1;
for(int i=hand[now];i;i=xx[i].next)
{
int v=xx[i].to;
if(dis[v]>dis[now]+xx[i].w)
{
dis[v]=dis[now]+xx[i].w;
q.push(make_pair(-dis[v],v));
}
}
}
}
int main()
{
cin>>n>>m>>g;
for(int i=1;i<=m;i++)//处理边,读入静态邻接表
{
int a,b,c;
cin>>a>>b>>c;
xx[++cnt].to=b;
xx[cnt].next=hand[a];//存的是上一条边
xx[cnt].w=c;
hand[a]=cnt;
}
djstl();
for(int i=1;i<=n;i++)
{
if(g==i) cout<<0<<" ";
else cout<<dis[i]<<" ";
}
cout<<endl;
return 0;
}