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;
				}
			}
		}
	}
}


posted @ 2020-07-17 08:42  Mudrobot  阅读(110)  评论(0)    收藏  举报