Dijkstra及其堆优化

朴素Dijkstra

#include<bits/stdc++.h>
using namespace std;
const int inf=9999999;
bool book[105];
int mp[105][105];
int dis[105];
int n,m;
void Dijkstra(int s){
	int start=s;
	memset(dis,inf,sizeof(dis));
	book[s]=1;
	for(int i=1;i<=n;i++) dis[i]=min(dis[i],mp[start][i]);
	int minn;
	for(int i=1;i<n;i++){
		minn=inf;
		for(int j=1;j<=n;j++)
			if(minn>dis[j]&&!book[j]){
				minn=dis[j];
				start=j;
			}
			book[start]=1;
		for(int j=1;j<=n;j++) dis[j]=min(dis[j],dis[start]+mp[start][j]);	
	}
}
int main(){
	int a,b,c,i,j;
	freopen("in.txt","r",stdin);
	cin>>n>>m>>j;
	memset(mp,inf,sizeof(mp));
	for(i=0;i<m;i++){
		cin>>a>>b>>c;
		mp[a][b]=c; mp[b][a]=c;
	}
	for(i=1;i<=n;i++) mp[i][i]=0;
	Dijkstra(j);
	for(i=1;i<=n;i++)
	cout<<dis[i]<<' ';
	cout<<endl;
	return 0;
}

Dijkstra堆优化

#include<bits/stdc++.h>
using namespace std;
struct node{
	int val,num;//val离出发点的最短距离,num该点编号 
	bool operator<(const node &a) const{//运算符重载 
	  return val<a.val;
	}
};
int dis[1005];
vector<pair<int,int> > a[1005];//fi下一点编号,se到下一点的距离
priority_queue<node> dij;//最小堆 
int n,m,s;
int main(){
	int x,y,z;
	freopen("in.txt","r",stdin);
	cin>>n>>m>>s;
	for(int i=1;i<=n;i++) dis[i]=99999999;
	for(int i=1;i<=m;i++) {
		cin>>x>>y>>z;
		a[x].push_back(make_pair(y,z));//把相连的边保存
	}
	dis[s]=0;
	dij.push((node){0,s});
	while(!dij.empty()){
		int front=dij.top().num; dij.pop();
		for(int i=0;i<a[front].size();i++){//对front能到达的顶点进行松弛操作
			int to=a[front][i].first,va=a[front][i].second;
			if(dis[to]>dis[front]+va){
				dis[to]=dis[front]+va;
				dij.push((node){dis[to],to});
			}
		}
	}
	for(int i=1;i<=n;i++)
	cout<<dis[i]<<' ';
	cout<<endl;
	return 0;
}

测试样例

4 6 1 
1 2 2 
2 3 2 
2 4 1 
1 3 5 
3 4 3 
1 4 4
posted @ 2018-11-18 19:03  ChunhaoMo  阅读(484)  评论(0)    收藏  举报