迪杰斯特拉算法总结
背景
(图片来自b站王道数据考研)
- 布尔值类型的final[]是为了标记该点是否被访问过。
- dist[]数组记录从起点到该点的最短距离。
- path[]数组是为存储到达该点距离最短时的上一个点。
主要代码
int inf=0x3f3f3f3f;//无穷大
bool final[100];
int dist[100];
int path[100];
int grap[100][100];//地图
void dijksta(int v0)
{
//初始化起点的值
final[v0]=1;
dist[v0]=inf;
path[v0]=-1;
for(int i=2;i<=n;++i)
{
final[i]=0;
dist[i]=grap[vo][i];
path[i]=0;
}
for(int i=1;i<n;++i)
{
int temp,Min=inf;
for(int j=1;j<=n;++j)
{
if(!final[j]&&dist[j]<Min)
{
temp=j;
Min=dist[temp];
}
}
fianl[temp]=1;//标记已经走过了
for(int j=1;j<=n;++j)
if(!final[j]&&dist[temp]+grap[temp][j]<dist[j])
{
dist[j]=dist[temp]+grap[temp][j];
path[j]=temp;
}
}
}
构造图代码
typedef struct//结构体
{
int ve[100];
int ar[100][100];
int venum,arnum;
}Grap;
//判断出顶点在二维数组中的位置
int LocatVe(Grap *g,int v)
{
int i=1;
for(;i<=g.venum;++i)
{
if(v==g->ve[i])
break;
}
if(i>g->venum)//没找到
return -1;
return i;//返回该顶点的位置
}
void CreateG(Grap *g)
{
for(int i=1;i<=g->venum;++i)
g->ve[i]=i;
for(int i=1;i<=g->venum;++i)
{
for(int j=1;i<=g->venum;++j)
{
g->ar[i][j]=inf;
}
}
for(int i=0;i<g->arnum;++i)
{
int v1,v2,w;
cin>>v1>>v2>>w;
int n=LocatVe(g,v1);
int m=LocatVe(g,v2);
if(n!=-1&&m!=-1)
g->ar[n][m]=g->ar[m][n]=w;
}
}
int inf=0x3f3f3f3f;
int grap[100][100];
int v1,v2,w;
for(int i=1;i<=n;++i)//初始化
for(int j=1;j<=n;++j)
grap[i][j]=inf;
for(int i=1;i<=t;++i)//改变一些权
{
cin>>v1>>v2>>w;
if(grap[v1][v2]>w)//选择最小的记录在地图中
{
grap[v1][v2]=grap[v2][v1]=w;
}
}
//只建立存在的顶点和边
# define inf 0x3f3f3f3f
struct edge
{
int v;//顶点
int next;
int w;//权值
};
edge arc[100];
int head[100];
int d[100];
int dist[100];
bool vis[100];
bool hash[100];
int cnt;
void Create(int v1,int v2,int w)
{
arc[cnt].v=v2;
arc[cnt].w=w;
arc[cnt].next=head[v1];
head[v1]=cnt++;
}
void Init()//初始化
{
cnt=0;
memset(head,-1,sizeof head);
memset(d,inf,sizeof d);
memset(vis,0,sizeof vis);
memset(hash,0,sizeof hesh);
}
解决少部分的最短路问题,题目还是会有变化,要根据题目的变化而选择合适的算法解题。
目前就想到这些