单源最短路算法

最短路径:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边权值之和最小的一条路径

单源最短路:在图中,指定一个点为源,求源到其它各点的最短路径

1.Dijkstra算法  o(nlogn)

流程

  1. 录入图的信息并完成初始化
  2. 找到目前离源节点最近的点P
  3. 利用P的所有出边优化源节点到P出边邻近节点的边权值
  4. 图除了源节点其余n-1个结点都优化过,那么进行5,否则进行2
  5. 输出
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=100;
const int maxm=10000;
int book[maxn],dis[maxn],head[maxn],cnt;
struct Node{
	int id;
	int d;
	int next;
}side[maxm];
struct node{
	int id;
	int cost;
	node(){};
	node(int id,int cost):id(id),cost(cost){}
	friend bool operator < (node a,node b)
	{
		return a.cost>b.cost;
	}
};
void init()
{
	memset(head,-1,sizeof(head));
	cnt=0;
}
void add(int x,int y,int d)
{
	side[cnt].id=y;
	side[cnt].d=d;
	side[cnt].next=head[x];
	head[x]=cnt++;
}
void dij(int sx,int ex)
{
	priority_queue<node> q;
	q.push(node(sx,0));
	dis[sx]=0;
	while(q.size())
	{
		node now=q.top();
		q.pop();
		if(book[now.id]) continue;
		book[now.id]=1;
		if(now.id==ex) break;
		for(int i=head[now.id];i!=-1;i=side[i].next)
		{
			int y=side[i].id;
			if(dis[y]>dis[now.id]+side[i].d)
			{
				dis[y]=dis[now.id]+side[i].d;
				q.push(node(y,dis[y]));
			}
		}
	}
	printf("%d\n",dis[ex]);
}
int main()
{
	int n,m,x,y,z,s,e;
	init();
	memset(dis,0x3f3f3f3f,sizeof(dis));
	memset(book,0,sizeof(book));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	scanf("%d%d",&s,&e);
	dij(s,e);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/why932346109/article/details/88177420
今日推荐