#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就用了这种思想,第一个循环枚举了用哪个
点来作为中转,第二第三循环枚举从谁走到谁,通过枚举所有的情况,最后就会得到最小值。
这时你会想,一个最短路是看整体的整个图来确定的,为什么每次两个点就可以搞定呢?
其实是这样的,每个使用过的点,在前一阶段求出了一个值,这时候再用它就等于已经继承了
它前面所计算出来的最短路的值,同过这个最短值上再去选择一条路,然后新形成的路还是一条
最短路,只是起终点不一样罢了。
这个算法抽象度较高,需加以图解和多想,掌握这个算法比较重要,它的思想在以后的
图论学习中比较重要,特别是继承的这种思想和松弛技术。
*/
今天有网友提到自己在Linux服务器中安装VNC桌面的时候安装都没有问题,但是在登录远程的时候居然有出现灰色界面,有三行代码提示"Accept clipboard from viewers,Send clipboard to viewers,Send primary selection to viewers"。即便我们重新登录也不行,这个到底如何解决呢?这里找几个可以解决的可能办法,我们多多尝试。...
零途云是一家香港公司,主要产品香港cn2 gia线路、美国Cera线路云主机,美国CERA高防服务器,日本CN2直连服务器;同时提供香港多ip站群云服务器。即日起,购买香港/美国/日本云服务器享受9折优惠,新用户有优惠码:LINGTUYUN,使用即可打折。目前,零途云还推出性价比非常高香港多ip站群云服务器,有需要的,可以关注一下。零途云优惠码:优惠码:LINGTUYUN (新用户优惠,享受9折优...
想必我们有一些朋友应该陆续收到国内和国外的域名注册商关于域名即将涨价的信息。大概的意思是说从9月1日开始,.COM域名会涨价一点点,大约需要单个9.99美元左右一个。其实对于大部分用户来说也没多大的影响,毕竟如今什么都涨价,域名涨一点点也不要紧。如果是域名较多的话,确实增加续费成本和注册成本。今天整理看到Dynadot有发布新的八月份域名优惠活动,.COM首年注册依然是仅需48元,本次优惠活动截止...