当前位置: 首页 > 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.jsqmd.com/news/47006/

相关文章:

  • CrewAI 上手攻略:多 Agent 自动化处理复杂任务,让 AI 像员工一样分工协作
  • 题解:AT_agc067_d [AGC067D] Unique Matching
  • 开发智联笔记项目所遇问题
  • 计算机视觉——从环境配置到跨线计数的完整实现基于 YOLOv12 与质心追踪器的实时人员监控优秀的系统
  • 搜维尔科技:利用MANUS数据手套实现灵巧远程操作:对20自由度灵巧手进行控制
  • 2025-11-21 早报新闻
  • CTF reverse入门记录
  • 开发智联笔记项目时的js问题
  • nju实验一选择器
  • 上海金蝶代理商推荐——上海宝蝶信息技术有限公司
  • 11.21模拟赛
  • HTML---------------图片转换(草稿)
  • 爱与时间反应鲜红色慢慢退却 一次次重复直到忘记了誓言
  • Mac 安装 JDK 8u281(JDK-8u281-1.dmg)详细步骤(附安装包)
  • chrome: 允许远程调试
  • Agent skills 实战
  • Vue 路由的学习
  • P8809 [蓝桥杯 2022 国 C] 近似 GCD 题解
  • 推荐一款超级好用的命令行工具 http-server
  • J 组要考,S 组也要考
  • AI浪潮下的新动向:协作、法律与未来工作
  • day11-Dify智能体-发布-工作流
  • puff-pastry靶机
  • day27-MCP进阶
  • Day37:2025年10月27日,星期一,上班。
  • Day36:2025年10月26日,星期天,休息。
  • Day42:2025年11月1日,星期六,值班,诸事皆顺。
  • 成都合成树脂瓦使用寿命影响因素?成都佳英耀旺告诉你
  • Day38:2025年10月28日,星期二,值班,诸事皆顺。
  • Day40:2025年10月30日,星期四,上班。