• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
橘如智
博客园    首页    新随笔    联系   管理    订阅  订阅
spfa模板

以hud畅通工程为例:用ford暴力也可ac

样例的图解:

 

spfa算法模板,用一个数组来储存从开始的点到其他点的距离,不断进行松弛操作。

还有用队列来保存与其相邻的点。

void spfa()
{
    q.push(1);
    dis[1] = 0;
    vis[1] = 1;
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        vis[u] = 0;
        for(int i = head[u]; i != -1; i = e[i].next)
        {
            int v = e[i].v;
            if(dis[v] > dis[u] + e[i].w)
            {
                dis[v] = dis[u] + e[i].w;
                if(!vis[v])
                {
                    vis[v] = 1;
                    q.push(v);
                }
            }
        }
    }
}

 

 

附代码:

#include <iostream>
#include <queue>
#include<cstring>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
using namespace std;
int save[220][220];
int n,m;
bool vis[220];
int d[220];

int spfa(int s,int t){
mem(vis,false);
mem(d,0x3f);
queue<int> q;
q.push(s);
d[s]=0;
vis[s]=true;
while(!q.empty()){
int c=q.front();
q.pop();
vis[c]=false;
for(int i=0;i<n;i++)
{
if(d[i]>d[c]+save[c][i])
{
d[i]=d[c]+save[c][i];
if(!vis[i])
{
vis[i]=true;
q.push(i);
}
}
}

}
if(d[t]>=inf)
return -1;
return d[t];

}
int main()
{


while(cin>>n>>m)
{
memset(save,0x3f,sizeof(save));
for(int i=0;i<m;i++)
{
int t1,t2,t3;
cin>>t1>>t2>>t3;
if(save[t1][t2]>t3)
{
save[t1][t2]=t3;
save[t2][t1]=t3;
}


}
int s,t;
cin>>s>>t;
cout<<spfa(s,t)<<endl;


}



}

posted on 2018-01-26 18:19  橘如  阅读(200)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3