当前位置: 首页 > news >正文

卡码网94: bellman_ford算法

算法思想
1.从边入手,对路径进行松弛操作
2.每次更新最短路径(松弛n-1)次

特:可有负权边,但是不能包含负权回路(可以判是否存在负权回路)

https://kamacoder.com/problempage.php?pid=1152
代码
朴素(不可判断负权回路)

include<bits/stdc++.h>

using namespace std;
int n,m;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
vector<vector>bian;
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
bian.push_back({a,b,c});
}
vectormisdis(n+1,INT_MAX);
misdis[1]=0;
for(int i=1;i<n;i++)
{
for(int j=0;j<m;j++)
{
int a=bian[j][0],b=bian[j][1],c=bian[j][2];
if(misdis[a]!=INT_MAX&&misdis[b]>c+misdis[a])
{
misdis[b]=misdis[a]+c;
}
}
}
if(misdis[n]==INT_MAX)
{
cout<<"unconnected";
return 0;
}
cout<<misdis[n];
return 0;
}
单纯遍历n-1次
O(mn);
队列优化

include<bits/stdc++.h>

using namespace std;
int n,m;
struct Edge
{
int to;
int val;
Edge(int x,int y):to(x),val(y){}
};

int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
vector<list>ljb(n+1);
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
ljb[a].push_back(Edge(b,c));
}
vectorinqueue(n+1,false);
queueque;
vectormindis(n+1,INT_MAX);
mindis[1]=0;
que.push(1);
inqueue[1]=1;
while(!que.empty())
{
auto p=que.front();
que.pop();
inqueue[p]=0;
for(Edge edge:ljb[p])
{
int to=edge.to;
int val=edge.val;
if(mindis[to]>mindis[p]+val)
{
mindis[to]=mindis[p]+val;
if(!inqueue[to])
{
inqueue[to]=1;
que.push(to);
}
}
}

}
if(mindis[n]==INT_MAX)
{cout<<"unconnected";return 0;
}
cout<<mindis[n];
return 0;

}
O(m)/平均
O(mn)/最坏(每个节点都和其他点相连)
朴素版+判断负权回路

include<bits/stdc++.h>

using namespace std;
int n,m;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
vector<vector>bian;
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
bian.push_back({a,b,c});
}
vectormisdis(n+1,INT_MAX);
misdis[1]=0;
bool flag=false;//
for(int i=1;i<=n;i++)//ii<=n查是否存在负权回路
{
for(int j=0;j<m;j++)
{
int a=bian[j][0],b=bian[j][1],c=bian[j][2];
if(i<n){
if(misdis[a]!=INT_MAX&&misdis[b]>c+misdis[a])
{
misdis[b]=misdis[a]+c;
}
}
else
{
if(misdis[a]!=INT_MAX&&misdis[b]>c+misdis[a])//还能再小->回路
{
flag=true;
cout<<"circle";
return 0;
}
}
}
}
if(flag1)
{
cout<<"circle";
return 0;
}
if(misdis[n]
INT_MAX)
{
cout<<"unconnected";
return 0;
}
cout<<misdis[n];
return 0;
}
队列优化+负权回路判断

include<bits/stdc++.h>

using namespace std;
int n,m;
struct Edge
{
int to;
int val;
Edge(int x,int y):to(x),val(y){}
};

int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
vector<list>ljb(n+1);
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
ljb[a].push_back(Edge(b,c));
}
vectorinqueue(n+1,false);
queueque;
vectormindis(n+1,INT_MAX);
vectorcount(n+1,0);//增加检查加入次数(判断如度)
count[1]++;
mindis[1]=0;
que.push(1);
inqueue[1]=1;
while(!que.empty())
{
auto p=que.front();
que.pop();
inqueue[p]=0;
for(Edge edge:ljb[p])
{
int to=edge.to;
int val=edge.val;
if(mindis[to]>mindis[p]+val)
{
mindis[to]=mindis[p]+val;
if(!inqueue[to])
{
inqueue[to]=1;
que.push(to);
count[to]++;
}
}
if(count[to]==n)//判断
{
cout<<"circle";
return 0;
}
}

}
if(mindis[n]==INT_MAX)
{cout<<"unconnected";return 0;
}
cout<<mindis[n];
return 0;

}

http://www.zskr.cn/news/56706.html

相关文章:

  • 题解:AT_agc067_d [AGC067D] Unique Matching
  • 计算机视觉——从环境配置到跨线计数的完整实现基于 YOLOv12 与质心追踪器的实时人员监控优秀的系统
  • CTF reverse入门记录
  • 上海金蝶代理商推荐——上海宝蝶信息技术有限公司
  • 11.21模拟赛
  • HTML---------------图片转换(草稿)
  • 爱与时间反应鲜红色慢慢退却 一次次重复直到忘记了誓言
  • Agent skills 实战
  • Vue 路由的学习
  • P8809 [蓝桥杯 2022 国 C] 近似 GCD 题解
  • 估值 7 亿美元,Wispr 要做语音操作系统,还要自研 ASR;马斯克:实时视频理解和生成是未来丨日报
  • day27-MCP进阶
  • Day42:2025年11月1日,星期六,值班,诸事皆顺。
  • Day38:2025年10月28日,星期二,值班,诸事皆顺。
  • Day32-35:2025年10月22日-25日,湖北襄阳、恩施州等地出差。
  • 用java写个小游戏
  • NCHU-温馨-BLOG1-单步电梯调度程序 - NCHU
  • 2025年评价高的四川泡椒竹笋加工厂TOP3排行榜
  • Windows打印后台处理程序严重漏洞分析与修复方案
  • 从MongoDB到国产数据库:一场2TB电子证照体系的“平滑着陆”实践
  • 预学习
  • 2025 年知名的成都二手集装箱公司最新 TOP 排行榜
  • 2025-11-20
  • 2025 年热门海运集装箱行业知名厂家排行榜!
  • 完整教程:AtCoder真题及详细题解 ABC427C: Bipartize
  • 面向对象程序设计-前3次作业总结
  • 南屏晚钟
  • 详细介绍:压缩与缓存调优实战指南:从0到1根治性能瓶颈(四)
  • 完整教程:【人工智能】神经网络的优化器optimizer(四):Adam自适应动量优化器
  • 2025 中国法兰阀门十大品牌推荐:密封升级 + 场景适配,优质厂家护航流体系统安全