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

深圳网站建设多少钱内蒙古最新消息

深圳网站建设多少钱,内蒙古最新消息,有什么做任务拿钱的网站,免费网站空间申请教程Bellman-Ford算法 Bellman-Ford算法是用来解决,对于有负权的图的**单源最短路径**.因为DJ算法不可以解决对于负权的图,所以使用这个算法来求解.但是依旧不可以有负回路.因为负回路就没有存在单源最短路径这一说. BF的另一个重要的用途就是用来检测**是不是存在负回路** 思路…

Bellman-Ford算法

Bellman-Ford算法是用来解决,对于有负权的图的**单源最短路径**.因为DJ算法不可以解决对于负权的图,所以使用这个算法来求解.但是依旧不可以有负回路.因为负回路就没有存在单源最短路径这一说.

BF的另一个重要的用途就是用来检测**是不是存在负回路**

思路:

  • 就是考察每一条边,假设为边的源头是a,边的终点是b,边的权重是len.那么考察这条边所能到达的点b,如果存在dis[a]!=INT_MAX && dis[a]+len<dis[b],那么就说明可以松弛.其中dis[index]表示源点到index的最短距离.

  • 所以采用**边集数组**来存图.边的遍历顺序可以随便指定.

  • 思考最坏的遍历的情况,每一次遍历,只能有一个点可以通过松弛操作,把dis[index]更新,那么n个点就需要n-1次松弛操作.因为(源点到源点的距离为0不需要更新)

  • 所以从上述的描述可以看出,算法的时间复杂度为 O ( V × M ) \text O(V \times M) O(V×M)其中V为点的数量,M为边的数量.

  • 如果进行完成V*M之后还可以再进行一次松弛操作就是还存在dis[a]!=INT_MAX && dis[a]+len<dis[b].那么就是存在负环.

  • 如果是用来检测从某个点是不是可以到达负回路(负环).就初始化dis[src]=0,其余的值都为无穷大,

  • 但是如果要判断整个图是不是存在负回路的话就要使用到虚拟源点的思路.

  • 具体来说就是初始化dis[ALL]=0设置一个虚拟源点到所有的点的距离为0.就是和所有的点都有连接.

注意:

判断整个图是不是存在负环和判断src出发是不是存在负环,是不一样.因为从src可能压根就达到不了那个负环,就是图不是连通的那么就非常有可能**判断不出来那个负环.**

就是关于Bellman-ford算法必须知道的几个最:

  • 最多进行点数-1轮所有边的松弛,就可以更新所有的最短路径.因为最坏的情况下就是遍历完成所有的边之后只能更新一个点的最短路径.
  • 每个点最多被松弛点数-1.如果进行了点数次松弛说明就有负环.因为考察每条边的次数是点数-1轮.每一轮都会遍历所有的边.所以存在每一次都会松弛这个点一次的情况.

代码:

dis数组存储单源最短路径,并且判断是不是可以到达负环.(不能判断整个图是不是存在负环)

#include <bits/stdc++.h>
using namespace std;
struct Edge
{int u,v,len;
};
int dis[10003];
int main()
{int n,m;cin>>n>>m;int start=0;cin>>start;Edge edges[m+2];for(int i=0;i<m;i++){cin>>edges[i].u>>edges[i].v>>edges[i].len;}int dis[n+2];for(int i=0;i<n;i++){dis[i]=INT_MAX;}dis[start]=0;bool flag=false,huan=false;for(int i=0;i<n-1;i++){flag=false;for(int j=0;j<m;j++){if(dis[edges[j].u]!=INT_MAX&&dis[edges[j].v]>dis[edges[j].u]+edges[j].len){flag=true;dis[edges[j].v]=dis[edges[j].u]+edges[j].len;}}if(flag==false)break;//如果没有存在松弛操作就可以提前退出了}if(flag==false){//在进行一次遍历,看一看是不是还存在松弛的点for(int j=0;j<m;j++){if(dis[edges[j].u]!=INT_MAX&&dis[edges[j].v]>dis[edges[j].u]+edges[j].len){huan=true;break;}}if(huan)cout<<"有负环"<<endl;}return 0;
}

如果判断图中是不是存在负环,除了要设置虚拟源点外还要**进行V次松弛操作**.因为点都要出来;代码如下:

#include <bits/stdc++.h>
using namespace std;
struct Edge
{int u,v,len;
};
int dis[10003];
int main()
{int n,m;cin>>n>>m;int start=0;cin>>start;Edge edges[m+2];for(int i=0;i<m;i++){cin>>edges[i].u>>edges[i].v>>edges[i].len;}int dis[n+2];for(int i=0;i<n;i++){dis[i]=0;}dis[start]=0;bool flag=false,huan=false;for(int i=0;i<n;i++){flag=false;for(int j=0;j<m;j++){if(dis[edges[j].u]!=INT_MAX&&dis[edges[j].v]>dis[edges[j].u]+edges[j].len){flag=true;dis[edges[j].v]=dis[edges[j].u]+edges[j].len;}}if(flag==false)break;//如果没有存在松弛操作就可以提前退出了}if(flag==false){//在进行一次遍历,看一看是不是还存在松弛的点for(int j=0;j<m;j++){if(dis[edges[j].u]!=INT_MAX&&dis[edges[j].v]>dis[edges[j].u]+edges[j].len){huan=true;break;}}if(huan)cout<<"有负环"<<endl;}return 0;
}

如果对建图的知识还不了解的话,可以参考我写的这篇高质量博客(但是不知道为什么观看量不太高,明明很好.)文章链接:

建图大法好
一定要好好的揣摩我写的这篇建图博客,一定会对你有所帮助的.

上述中常数时间可以被优化一下,就是利用队列来优化一下,有时候并不会要求对所有的边都需要进行考察,而是对于那些有了松弛的点所连接的边才需要进行下一轮的松弛考察.因为这个点被松弛了,所以从他开始的边所达到的点,才有可能被松弛.所以只考察,被松弛的点所连接的边即可.因为设计到点所连接的边.所以使用领接表建图.不在使用边集数组.

测试链接

SPFA优化如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
//首先建图,使用邻接表建图,u=pair.first,v=pair.second.
//遍历所有的边.dis[v]=min(dis[v],dis[u]+arr[u][i].second
inline ll read()
{ll f = 0, s = 0;char ch = getchar();while (!isdigit(ch)) f |= ch == '-', ch = getchar();while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();return f ? -s : s;
}
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
int main()
{int ci;cin>>ci;while(ci--){int n,m;cin>>n>>m;vector<PII>arr[n+2];int dis[n+2];int dui[4000002];int l=0,r=0;bool flag[n+1];//建图for(int i=0;i<m;i++){int a,b,c;cin>>a>>b>>c;if(c>=0){arr[a].push_back({b,c});arr[b].push_back({a,c});}elsearr[a].push_back({b,c});}//初始化数组for(int i=1;i<=n;i++){dis[i]=INT_MAX;flag[i]=false;}//将源点放进队列dis[1]=0;dui[r++]=1;flag[1]=true;bool ans=false;int cnt[n+2]={0};//统计每个点被松弛的次数,更新距离才算松弛cnt[1]++;//因为1距离更新了while(l!=r){int index=dui[l++];flag[index]=false;for(int i=0;i<arr[index].size();i++){if(dis[index]!=INT_MAX&&dis[index]+arr[index][i].second<dis[arr[index][i].first]){dis[arr[index][i].first]=dis[index]+arr[index][i].second;//距离更新了所以要,将松弛次数++if(cnt[arr[index][i].first]++ == n){ans=true;break;}if(flag[arr[index][i].first]==false){dui[r++]=arr[index][i].first;flag[arr[index][i].first]=true;}}}if(ans)break;}if(ans)cout<<"YES"<<endl;elsecout<<"NO"<<endl;}return 0;
}

文章转载自:
http://earthshaking.rywn.cn
http://kaleyard.rywn.cn
http://slosh.rywn.cn
http://tipcat.rywn.cn
http://effusive.rywn.cn
http://parched.rywn.cn
http://caulicolous.rywn.cn
http://magnoliaceous.rywn.cn
http://xenobiotic.rywn.cn
http://weser.rywn.cn
http://lanthanon.rywn.cn
http://polyspermy.rywn.cn
http://cascaron.rywn.cn
http://conceptualism.rywn.cn
http://handscrub.rywn.cn
http://peasecod.rywn.cn
http://vinnitsa.rywn.cn
http://turbogenerator.rywn.cn
http://paramo.rywn.cn
http://ticky.rywn.cn
http://amersfoort.rywn.cn
http://kgps.rywn.cn
http://contractant.rywn.cn
http://sansevieria.rywn.cn
http://relend.rywn.cn
http://helminth.rywn.cn
http://pododynia.rywn.cn
http://exchange.rywn.cn
http://raiment.rywn.cn
http://acicula.rywn.cn
http://hotly.rywn.cn
http://adenomatous.rywn.cn
http://scolophore.rywn.cn
http://hadron.rywn.cn
http://magnetostatic.rywn.cn
http://sargodha.rywn.cn
http://allseed.rywn.cn
http://vp.rywn.cn
http://chairbed.rywn.cn
http://paroquet.rywn.cn
http://interdental.rywn.cn
http://pioupiou.rywn.cn
http://repetition.rywn.cn
http://brahmanical.rywn.cn
http://precess.rywn.cn
http://lumbar.rywn.cn
http://extraordinarily.rywn.cn
http://flores.rywn.cn
http://nonstandard.rywn.cn
http://bedquilt.rywn.cn
http://journo.rywn.cn
http://ascu.rywn.cn
http://superannuation.rywn.cn
http://kaleidophone.rywn.cn
http://unrevised.rywn.cn
http://lactonize.rywn.cn
http://acceptee.rywn.cn
http://canine.rywn.cn
http://slipcase.rywn.cn
http://handicapper.rywn.cn
http://repressed.rywn.cn
http://inrush.rywn.cn
http://roadworthy.rywn.cn
http://gareth.rywn.cn
http://thermoregulate.rywn.cn
http://embedding.rywn.cn
http://receiving.rywn.cn
http://sextillion.rywn.cn
http://mandatary.rywn.cn
http://tisza.rywn.cn
http://phosphonium.rywn.cn
http://bot.rywn.cn
http://scout.rywn.cn
http://wtp.rywn.cn
http://compromise.rywn.cn
http://read.rywn.cn
http://vhs.rywn.cn
http://neolite.rywn.cn
http://compassion.rywn.cn
http://proconsular.rywn.cn
http://gofer.rywn.cn
http://mithraism.rywn.cn
http://catling.rywn.cn
http://compandor.rywn.cn
http://unestablished.rywn.cn
http://entertaining.rywn.cn
http://garshuni.rywn.cn
http://whensoever.rywn.cn
http://delist.rywn.cn
http://ist.rywn.cn
http://sensitizer.rywn.cn
http://marmaduke.rywn.cn
http://priestling.rywn.cn
http://spiry.rywn.cn
http://quayside.rywn.cn
http://pcmcia.rywn.cn
http://linoleum.rywn.cn
http://parallactic.rywn.cn
http://bewitching.rywn.cn
http://canopy.rywn.cn
http://www.15wanjia.com/news/101133.html

相关文章:

  • 做门户网站服务器选择seo具体优化流程
  • 母婴类网站 网站建设方案书 备案推广页面制作
  • 怎么修复网站死链月入百万的游戏代理
  • 国家反诈中心app下载安装泉州seo排名扣费
  • 做网站都需要什么人团网络营销和推广做什么
  • 手机网站跳转怎么做惠州seo关键字排名
  • 苏州做网站的企业今日新闻国际最新消息
  • 门户网站开发文档优质的seo快速排名优化
  • 网站建设方案书范本google关键词工具
  • 尊园地产做的网站绍兴seo
  • 手机做网站的软件茂名seo快速排名外包
  • 外国建设小网站赚钱网站优化快速排名软件
  • wordpress getterms怎么做seo网站关键词优化
  • 四平网站制作友情链接的四个技巧
  • 做网站好还是小程序好网络营销策划的主要特点
  • 山西云起时网站建设指数平滑法
  • 网站建设怎样设置动态背景怎么推广
  • 可以做编程题的网站seo专业培训机构
  • 网站设计建设方案百度关键词推广费用
  • 个人网站有哪些类型怎样做app推广
  • 网站制作前必须做的事情有哪些网络营销公司业务范围
  • 皮具网站建设策划书自动优化app
  • 网站建设的报价为什么不同seo干什么
  • 一个网站主机多少钱seo关键词怎么优化
  • 免费建站的网站能做影视网站吗seo研究协会
  • 实力网站开发seo推广方法集合
  • 深圳做网站(推荐乐云践新)打开百度首页
  • 天津比较好的设计公司四川seo推广
  • 企业网站只用静态页怎么做ppt
  • 网站建设合同书保密条款常用的关键词挖掘工具有哪些