愿各位程序员都能记住,输出第一条hello world时候的心情。坚持下去,你的每一条代码都在默默的改变世界,加油!加油!加油! “这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。 什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。 人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。

任意两点最短路径 最短路之floyd

 

本人水平有限,题解不到为处,请多多谅解

 

本蒟蒻谢谢大家观看

 

 

floyd算法:

设D[k,i,j]表示“经过若干个编号不超过k的节点” 从i到j的最短路径长度

D[k,i,j]=min(D[k-1,i,j],D[k-1,i,k]+D[k-1,k,j]);

初始为D[0,i,j]=A[i,j];A为邻接矩阵

设有向图G=(V,E),V为点集,E为边集,(x,y)表示一条从x到y的有向图,其边权(或称长度)为W(x,y)。设n=|V|,m=|E|,邻接矩阵A是一个n*n的矩阵。

A的定义如下:

A[i,j]={  0   i=j

     w(i,j)  (i,j)属于E

     +∞   (i,j)不属于E

    }

所以k为阶段,所以必须置于最外层循环中

省略k这一维之后的DP

D[i,j]=min(D[i,k]+D[k,j]);

最终D[i,j]为i到j的最短路径长度

 

 模板如下:

 

code:

 1 #include<bits/stdc++.h>
 2 #pragma GCC optimize(3)
 3 
 4 using namespace std;
 5 int n,m;
 6 int f[310][310];
 7 inline int read(){
 8     int x=0,f=1;char ch=getchar();
 9     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
10     while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
11     return x*f;
12 }
13 inline void write(int x)
14 {
15     if(x<0)x=-x,putchar('-');
16     if(x>9)write(x/10);
17     putchar(x%10+'0');
18 }
19 int main()
20 {
21     memset(f,0x3f,sizeof(f));//初始距离最大 
22     for(int i=1;i<=n;i++)f[i][i]=0;//自己到自己的距离为0 
23     n=read(),m=read();
24     for(int i=1,x,y,z;i<=m;i++){
25         x=read(),y=read(),z=read();
26         f[x][y]=min(f[x][y],z);//建邻接矩阵 
27     }
28     for(int k=1;k<=n;k++){
29         for(int i=1;i<=n;i++){
30             for(int j=1;j<=n;j++){
31                 f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
32             }
33         }
34     }
35     return 0;
36 }

应用:

传递闭包

 

code:

 1 #include<bits/stdc++.h>
 2 #pragma GCC optimize(3)
 3 
 4 using namespace std;
 5 int n,m;
 6 bool f[310][310];
 7 inline int read(){
 8     int x=0,f=1;char ch=getchar();
 9     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
10     while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
11     return x*f;
12 }
13 inline void write(int x)
14 {
15     if(x<0)x=-x,putchar('-');
16     if(x>9)write(x/10);
17     putchar(x%10+'0');
18 }
19 int main()
20 {
21     for(int i=1;i<=n;i++)f[i][i]=1; 
22     n=read(),m=read();
23     for(int i=1,x,y,z;i<=m;i++){
24         x=read(),y=read(),z=read();
25         f[x][y]=f[y][x]=1;
26     }
27     for(int k=1;k<=n;k++){
28         for(int i=1;i<=n;i++){
29             for(int j=1;j<=n;j++){
30                 f[i][j]|=f[i][k]&f[k][j];
31             }
32         }
33     }
34     return 0;
35 }

 

posted @ 2019-10-31 12:00  max_lemon  阅读(369)  评论(0编辑  收藏  举报
Live2D
别人恋爱不成功,你连暗恋都不成功! 你写不出代码的原因只有一个,那就是你没有彻底理解这个算法的思想!!-----沃茨·基硕德