第三章 搜索与图论(二)(最短路)
一、最短路问题
1、对于稠密图,由于朴素版的dijkstra算法与边数无关使用这种算法的复杂度较低。稀疏图用堆优化版的算法;单源最短路中存在负权边用SPFA 算法通常较好;多源用floyd算法;
难点:如何建图,抽象为最短路问题。
二、朴素版dijkstra算法
由于稠密图用这种算法,邻接矩阵存图,注意把g初始化为0x3f;st保存每个数组的状态,
#include
//849dijkstra最短路
using namespace std;
const int N=510;
int g[N][N],disk[N],st[N];
int n,m;
int dijkstra()
{
disk[1]=0;
for(int i=1;in>>m;
memset(disk,0x3f,sizeof disk);//初始化最短路为正无穷
memset(g,0x3f,sizeof g);
memset(st,-1,sizeof st);
for(int i=0;i>a>>b>>c;
//由于存在重复带权边,所以要留住那个较短的边因此初始化g为无穷
g[a][b]=min(g[a][b],c);
}
int t=dijkstra();
cout>m;
memset(disk,0x3f,sizeof disk);//初始化最短路为正无穷
memset(st,-1,sizeof st);
memset(h,-1,sizeof h);
for(int i=0;i>a>>b>>c;
add(a,b,c);
}
int t=dijkstra();
cout>k;
for(int i=0;i>a>>b>>w;
edges[i]={a,b,w};//保存边
}
int t=bellman_ford();
if(t==-1)puts("impossible");
else cout>m;
memset(h,-1,sizeof h);
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
int t=spfa();
if(t==-1)puts("impossible");
else cout>m;
memset(h,-1,sizeof h);
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
int t=spfa();
if(spfa())puts("Yes");
else puts("No");
}
六、弗洛伊德Floyd算法求多源最短路
三重循环
#include
//852 spfa判断是否
using namespace std;
const int N=210,INF=1e9;
int d[N][N];
int n,m,Q;
void floyd()
{
for(int k=1;k>m>>Q;
for(int i=1;ia>>b>>c;
d[a][b]=min(d[a][b],c);
}
floyd();
while(Q--)
{
int a,b;
cin>>a>>b;
if(d[a][b]
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

