复健2--最短路

因为是给自己写的所以不赘述很多前置知识了(((

众所周知,前向星 茴香豆 有四种写法

然后第一个放的是学OI的时候写的spfa(他死了)
(不得不说真是太丑了!)

spfa就好比整个图不断遍历的过程,遇到没有遍历过的点就直接push进去,非常简单易懂(所以它被卡了)
通过构造数据,spfa的复杂度可以被卡到O(NM)的级别,当没有负环出现的时候不建议使用,负权图也不可能卡spfa(暴论)

#include<bits/stdc++.h>
using namespace std;
int head[500005],tot,m,n,s;
int dis[10005];
bool v[10005];
queue<int> q;
struct node{
	int dis;
	int next;
	int to;
}e[500005];
void add(int x,int y,int z){
	e[++tot].to=y;
	e[tot].dis=z;
	e[tot].next=head[x];
	head[x]=tot;
}
void spfa(){
	for(int i=1;i<=n;i++){
		dis[i]=2147483647;
		v[i]=0;
	}
	q.push(s);
	dis[s]=0;
	v[s]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();v[u]=0;
		for(int i=head[u];i>0;i=e[i].next){
			int vi=e[i].to;
			if(dis[vi]>dis[u]+e[i].dis){
				dis[vi]=dis[u]+e[i].dis;
				if(!v[vi]){
					v[vi]=1;
					q.push(vi);
				}
			}
		}
	}
}
int main(){
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++){
		int f,g,w;
		cin>>f>>g>>w;
		add(f,g,w);
	}
	spfa();
	for(int i=1;i<=n;i++)
		if(s==i) cout<<0<<" ";
		else cout<<dis[i]<<" ";
	return 0;
}

接下来放的是堆优化版本的dijstra,dij的复杂度非常稳定,朴素版本的dij一般是O(n^2)的,因为没有负值所以可以用贪心的思想对边进行松弛操作,在松弛过程中用优先队列维护出一个最小值就可以实现最优,其实也没必要手写堆或者重载运算符,丢个负值进去就可以直接用啦,STL大法好!(破音,复杂度可以优化到O((m+n)logn)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+3;
int ver[N*2],pre[N],edge[N*2],next[N*2],tot,n,m,s;
ll dis[N];
bool vis[N];
priority_queue< pair<int,int> >q;
void add(int x,int y,int z){
	ver[++tot]=y;
	edge[tot]=z;
	next[tot]=pre[x];
	pre[x]=tot;	
}
void dijstra(int s){
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[s]=0;q.push(make_pair(0,s));
	while(q.size()){
		int u=q.top().second;q.pop();
		if(vis[u])continue;vis[u]=1;
		for(int i=pre[u];i;i=next[i]){
			int v=ver[i];
			if(dis[v]>dis[u]+edge[i]){
				dis[v]=dis[u]+edge[i];
				q.push(make_pair(-dis[v],v));
			}
		}
	}
} 
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
	}
	dijstra(s);
	for(int i=1;i<=n;i++)printf("%d ",dis[i]);
} 
posted @ 2020-11-07 23:53  maniac!  阅读(86)  评论(0)    收藏  举报