标签:总结 图论 Code 滚动 int 短路 基础知识 传递性 一维
一、Floyed
用于求解多源最短路,可适用于负边权,有向图无向图都可。
原理:
设f[k][i][j]表示经过节点编号不超过k的点,i到j的最短路,
则f[k][i][j]=min(f[k-1][i][j],f[k-1][i][k]+f[k-1][k][j]).
初值为f[0][i][j]=a[i][j],则答案即为f[n][i][j]
其中k是阶段,循环时需置于外层,且k这一维可以滚动.
Code
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
其实按理说,k这一维应该用0,1两维进行滚动,因为用到的f[i][k],f[k][j]可能已经被更新到k这个阶段的了,但是显然f[k-1][i][k]=f[k][i][k]
应用:
- 传递闭包
给定若干个元素和若干对二元关系,且关系具有传递性(如a<b,b<c,则a<c)。
求出尽量多的元素之间的关系。
如果传递性是无向的,可以用并查集更高效的维护。
但如果是有向的,则可以用floyed进行求解。
Code
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
f[i][j]|=f[i][k]&f[k][j];
- 最小环
标签:总结,图论,Code,滚动,int,短路,基础知识,传递性,一维 来源: https://www.cnblogs.com/glq-Blog/p/16122570.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。