A了一道dijkstra板子

Dijkstra板子

虽然不知道为什么这样写,但板子还是要有的

void dij(int s){
	memset(dis,0x3f,sizeof(dis));
	memset(v,0,sizeof(v));
	priority_queue<P,vector<P>,greater<P> > q;//如果是<P>的话,之后push就要(P){-dis[y],y}
	q.push((P){0,s});
	dis[s]=0;
//	v[s]=1;这句一定不能有
	while(!q.empty()){
		P u=q.top();
		q.pop();
		int x=u.second;
		if(dis[x]<u.first)continue;
		for(int i=head[x];i;i=e[i].nex){
			int y=e[i].to;
			if(dis[y]>dis[x]+e[i].w){
				dis[y]=dis[x]+e[i].w;
				q.push((P){dis[y],y});
			}
		}
	}
}

题目

#include<iostream>
#include<cstdio>
#include<queue>
#include<utility>
#include<cstring>
using namespace std;

typedef pair<int,int> P;
const int MAXN=1000000+5;

struct ed{
	int w,to,nex;
};

ed e[MAXN];
int dis[MAXN],v[MAXN],head[MAXN];
int newp,n,m,s,t;

void dij(int s);
void Add(int p1,int p2,int w);

int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;++i){
		int p1,p2,w;
		scanf("%d%d%d",&p1,&p2,&w);
		Add(p1,p2,w);
		Add(p2,p1,w);
	}
//	scanf("%d",&s);
	dij(s);
	for(int i=1;i<=n;++i){
		printf("%d ",dis[i]);
	}
//	putchar('
');
//	printf("%d
",dis[t]);
	return 0;
}

void Add(int p1,int p2,int w){
	++newp;
	e[newp].to=p2;
	e[newp].w=w;
	e[newp].nex=head[p1];
	head[p1]=newp;
}

void dij(int s){
	memset(dis,0x3f,sizeof(dis));
	memset(v,0,sizeof(v));
	priority_queue<P,vector<P>,greater<P> > q;
	q.push((P){0,s});
	dis[s]=0;
//	v[s]=1;
	while(!q.empty()){
		P u=q.top();
		q.pop();
		int x=u.second;
		if(dis[x]<u.first)continue;
		for(int i=head[x];i;i=e[i].nex){
			int y=e[i].to;
			if(dis[y]>dis[x]+e[i].w){
				dis[y]=dis[x]+e[i].w;
				q.push((P){dis[y],y});
			}
		}
	}
}

注释是用来A其他题的。。

原文地址:https://www.cnblogs.com/buringstraw/p/9940209.html