目标算法:Dijkstra算法
应用范围:最短路
算法代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 205;
const int Inf = 0x3f3f3f;
int map[maxn][maxn];
int dis[maxn];
int vis[maxn];
int n,m;
int x,y,z;
void mapinit()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i == j)
map[i][j] = 0; //自己到自己的距离为0
else
map[i][j] = Inf; //初始化为一个足够大的数来判断最后是否能到达
}
}
} //初始化邻接矩阵
void Arrayinit(int start)
{
for(int i=0;i<n;i++)
{
dis[i] = map[start][i];
vis[i] = 0;
}
}// 初始化访问数组和dis数组
int Dijkstra(int start,int end)
{
Arrayinit(start);
vis[start] = 1;
for(int i=0;i<n;i++)
{
int Min = Inf;
int flag;
for(int j=0;j<n;j++)
{
if(dis[j] < Min && !vis[j])
{
flag = j;
Min = dis[j];
}
}
vis[flag] = 1;
for(int j=0;j<n;j++)
{
if(map[flag][j]+dis[flag] < dis[j] && !vis[j])
dis[j] = map[flag][j] + dis[flag];
}
}
if(dis[end] == Inf) // 如果终点距离为Inf,则说明无法到达终点,返回-1
return -1;
else
return dis[end];
} // 迪杰斯特拉算法
int main()
{
while(~scanf("%d%d",&n,&m))
{
mapinit();
int start,end;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(map[x][y] > z)
map[x][y] = map[y][x] = z; //两个节点之间可能存在多条边,选择其中最小的进行储存
}
scanf("%d%d",&start,&end);
int ans = Dijkstra(start,end);
printf("%d\n",ans);
}
return 0;
}