优先队列优化迪杰斯特拉

优先队列优化迪杰斯特拉_第1张图片

6 9
1 2 2
1 4 4
2 3 7
2 4 1
2 5 5
2 6 6
3 6 2
4 5 4
5 6 1

还有些理解的不透彻的地方,回头再想。

#include
#include
#include
#include

#define MAX_N 100005
#define INF 1e8

using namespace std;

typedef struct Node{
	int no;
	int val;
	bool operator < (const Node &A)const{ return val>A.val;}
}Node;

int n,m;
vector<vector<Node> > Map;

void create_map()
{
	cin>>n>>m;
	Map.resize(n+1);
	int a,b,val;
	for(int i=0;i<m;++i){
		cin>>a>>b>>val;
		Map[a].push_back((Node){b,val});
		Map[b].push_back((Node){a,val});
	}
}

void dijkstra(int start)
{
	bool vis[MAX_N];
	memset(vis,false,sizeof(vis));
	
	int dis[MAX_N];
	fill(dis,dis+n+1,INF);
	dis[start]=0;
	
	priority_queue<Node> q;
	while(!q.empty()) q.pop();
	
	q.push((Node){start,0});
	while(!q.empty()){
		Node now=q.top();
		q.pop();
		vis[now.no]=true;
		
		for(auto A:Map[now.no]){
			if(vis[A.no]) continue;
			if(dis[A.no]>dis[now.no]+A.val){
				dis[A.no]=dis[now.no]+A.val;
				q.push((Node){A.no,dis[A.no]});
			}
		}
	}
	for(int i=1;i<=n;++i) cout<<dis[i]<<' ';
}

int main()
{
	create_map();
	dijkstra(1);
	
	return 0;
}

你可能感兴趣的:(C)