算法学习(22):最短路

最短路

floyd

for (k = 1; k <= n; k++) {
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
      f[k][i][j] = min(f[k - 1][i][j], f[k - 1][i][k] + f[k - 1][k][j]);
    }
  }
}

堆优化dijkstra

//by ziwan Catherine
//堆优化dijkstra 边长为非负数 
//d[n]从起点到n的最短路 
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue> 
using namespace std; 
const int N=10010,M=1000010;
int head[N],ver[M],edge[M],next[M],d[N];
bool v[N];
int n,m,tot;
priority_queue< pair<int,int> > q;
//大根堆 优先队列 pair第一维为dist相反数(变成小根堆) 第二维为节点编号 
void dijkstra(){
	memset(d,0x3f,sizeof(d));
	d[1]=0;//dist初始化 起点为0,其余为正无穷
	memset(v,0,sizeof(v));//节点标记
	q.push(make_pair(0,1));
	while(q.size()){
		int x=q.top().second;q.pop();//取堆顶
		if(v[x]) continue;v[x]=1;
		for(int i=head[x];i;i=next[i]){//扫描所有出边
			int y=ver[i],z=edge[i];
			if(d[y]>d[x]+z) {
				d[y]=d[x]+z;
				q.push(make_pair(-d[y],y));
			}
		} 
	} 
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		ver[++tot]=y,edge[tot]=z;
		next[tot]=head[x],head[x]=tot;
	}//构建邻接矩阵 
	dijkstra();
	for(int i=1;i<=n;i++)
	cout<<d[i]<<endl;
	return 0;
}

posted on 2021-05-21 17:56  小星◎  阅读(46)  评论(0)    收藏  举报

导航