#include<stdio.h> #include<string.h> int path[101][101]={0}; void p(int e,int s) { int k=path[e][s]; if(k!=0) { p(e,k); printf(" %d",k); p(k,s); } } int main() { memset(path,0,sizeof(path)); int adj[101][101]; int n; scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&adj[i][j]); if(adj[i][j]==0) adj[i][j]=65535; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) if(k!=i) for(int j=1;j<=n;j++) if(j!=i && j!=k) { if(adj[i][k]+adj[k][j]<adj[i][j]) { adj[i][j]=adj[i][k]+adj[k][j]; path[i][j]=k; } } int s,e; scanf("%d%d",&s,&e); if(adj[s][e]==65535) printf("No way!! "); else { printf("%d ",adj[s][e]); printf("%d",s); p(s,e); printf(" %d ",e); } return 0; } /* 著名的floyd算法,它是多源最短路径算法,也就说可以给除任意两结点的最短路, 如果它们有路,时间复杂度O(n^3)
算法分析:
先提出疑问,这个算法是怎样做到求最短路径的呢?
其实对于最短路,我们说的路最短也就是是权值最小,并不是单方面的说路的长度
这个权值可以是造价,耗费,长度,时间等等,我们首先要理解这一点。
从小张家到小李家有50米的路程,到小王家有10米,小王家到小李家20米远,这时我们
要从小张家到王家最少要走多远,答案是30米,我们选择路线的时候没有直接走过去,而且发现
了一中转点,可以使得整个路程更短。
其实floyd就用了这种思想,第一个循环枚举了用哪个
点来作为中转,第二第三循环枚举从谁走到谁,通过枚举所有的情况,最后就会得到最小值。
这时你会想,一个最短路是看整体的整个图来确定的,为什么每次两个点就可以搞定呢?
其实是这样的,每个使用过的点,在前一阶段求出了一个值,这时候再用它就等于已经继承了
它前面所计算出来的最短路的值,同过这个最短值上再去选择一条路,然后新形成的路还是一条
最短路,只是起终点不一样罢了。
这个算法抽象度较高,需加以图解和多想,掌握这个算法比较重要,它的思想在以后的
图论学习中比较重要,特别是继承的这种思想和松弛技术。
*/
近日CloudCone发布了七月的特价便宜优惠VPS云服务器产品,KVM虚拟架构,性价比最高的为2核心1.5G内存1Gbps带宽5TB月流量,2.89美元/月,稳定性还是非常不错的,有需要国外便宜VPS云服务器的朋友可以关注一下。CloudCone怎么样?CloudCone服务器好不好?CloudCone值不值得购买?CloudCone是一家成立于2017年的美国服务器提供商,国外实力大厂,自己开...
大硬盘服务器、存储服务器、Chia矿机。RackNerd,2019年末成立的商家,主要提供各类KVM VPS主机、独立服务器和站群服务器等。当前RackNerd正在促销旗下几款美国大硬盘服务器,位于洛杉矶multacom数据中心,亚洲优化线路,非常适合存储、数据备份等应用场景,双路e5-2640v2,64G内存,56G SSD系统盘,160T SAS数据盘,流量是每月200T,1Gbps带宽,配5...
41云怎么样?41云是国人主机品牌,目前经营产品有国内外云服务器、CDN(高防CDN)和物理机,其中国内外云服务器又细分小类有香港限流量VPS、香港大带宽VPS、香港弹性自选VPS、香港不限流VPS、香港BGP线路VPS、香港Cera+大带宽机器、美国超防VPS、韩国原生VPS、仁川原生VPS、日本CN2 VPS、枣庄高防VPS和金华高防VPS;物理机有美国Cera服务器、香港单程CN2服务器、香...