DASH!
快速查看(正版最短路):
/*
Name: P4779 【模板】单源最短路径(标准版)
Copyright:
Author: Mudrobot
Date: 2018/10/19 20:57:45
Description: Graph Theory (The Shortest Path)
*/
#include<bits/stdc++.h>
#define gc() getchar()//caution!!!
#define N 100005
using namespace std;
/*inline char gc() {
static char buf[1<<18],*fs,*ft;
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<18,stdin)),fs==ft)?EOF:*fs++;
}*/
template<class T>
inline void read(T &aa) {
register int k=0,f=1;
register char c=gc();
for (;!isdigit(c);c=gc()) if(c=='-')f=-1;
for (;isdigit(c);c=gc()) k=(k<<3)+(k<<1)+(c-'0');
aa=k*f;
}
template<class T>
inline void out(T x){if(x>9)out(x/10);putchar(x%10+'0');}
struct sd{
int val,to,next;
bool operator < (const sd & njc) const{
return val>njc.val;
}
sd(){}
sd(int a,int b,int c){
next=a;to=b;val=c;
}
}edge[N*2];
bool vis[N];
int n,m,s,qnt,head[N],dis[N];
void add(int a,int b,int c){
edge[++qnt].next=head[a];edge[qnt].to=b;edge[qnt].val=c;head[a]=qnt;
}
void Dijkstra(int s){
for(int i=1;i<=n;i++) dis[i]=2147483647;
priority_queue<sd> q;
dis[s]=0;q.push(sd(0,s,dis[s]));
while(!q.empty()){
sd now=q.top();q.pop();
if(vis[now.to]) continue;
vis[now.to]=true;
for(int i=head[now.to];i;i=edge[i].next){
int v=edge[i].to,val=edge[i].val;
if(dis[v]>dis[now.to]+val){
dis[v]=dis[now.to]+val;
q.push(sd(0,v,dis[v]));
}
}
}
}
int main()
{
//freopen(".in", "r", stdin);freopen(".out", "w", stdout);
read(n);read(m);read(s);int a,b,c;
for(int i=1;i<=m;++i){
read(a);read(b);read(c);
add(a,b,c);
}
Dijkstra(s);
for(int i=1;i<=n;++i) out(dis[i]),putchar(' ');
//fclose(stdin);fclose(stdout);
return 0;
}
/*
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
*/
SPFA 加优化
void spfa(long long s)
{
for(long long i = 1;i <= n; i++) dis[i] = 2147483647;
memset(vis, 0, sizeof(vis));
deque<long long> q;
dis[s] = 0;
vis[s] = 1;
q.push_back(s);
while(!q.empty())
{
long long top = q.front();
q.pop_front();
vis[top] ^= 1;
for(long long i = head[top];i; i = edge[i].next)
{
long long u = edge[i].to;
if(dis[u] > dis[top] + edge[i].val)
{
dis[u] = dis[top] + edge[i].val;
if(!vis[u])
{
if(!q.empty() && dis[q.front()] > dis[u])
q.push_front(u);
else q.push_back(u);
vis[u] ^= 1;
}
}
}
}
}

浙公网安备 33010602011771号