//单源最短路径问题
//Bellman-Ford
struct edge
{
int from,to,cost;
};
edge es[N]; //es是边
int d[M];
int v,e; //v是顶点数,e是边数
void shortestpath(int s)//s是顶点
{
for(int i=0;i<v;i++) d[i]=INF;
d[s]=0;
while(true)
{
bool update=false;
for(int i=0;i<e;i++)
{
edge e=es[i]; //或可以两层循环,枚举每一条边和每一个顶点,这样可以解决负权图
if(d[e.from]!=INF&&d[e.to]>d[e.from]+e.cost)
{
update=true;
d[e.to]=d[e.from]+e.cost;
}
}
if(!update) break;//无法更新,退出循环
}
}
//Dijksrea,不能解决负权图
int cost[N][N];
int d[N];
bool used[N];
int n;//n是顶点数
//先进行初始化,这里省略
//核心代码
for(i=1;i<=n-1;i++)
{
min=inf;
for(j=1;j<=n;j++)
{
if(used[j]==0&&d[j]<min)
{
min=d[j];
u=j;
}
}
used[u]=1;
for(v=1;v<=n;v++)
{
if(e[u][v]<inf)
{
if(dis[v]>dis[u]+e[u][v])
dis[v]>dis[u]+e[u][v];
}
}
}
//暴力的Floyd-Warshall
for(int k=0;k<v;k++)
for(int i=0;i<v;i++)
for(int j=0;j<v;j++)
d[i][j]= min(d[i][j],d[i][k]+d[k][j]);
最短路径算法
最新推荐文章于 2024-07-08 22:12:26 发布