认真读题。
弗洛伊德,
初始化为极大值,如果是自己到自己则赋值为0;
然后注意输入时那个环上权值的赋值操作,比较好理解;
把字符转化为数字做下标,
如果不为极大值的话,说明已经被赋值了,已经有直接连接这两个点的路了,
根据题目要求,这种情况下我们要取较大的那个;
如果为极大值,说明还没有被赋值,此时直接赋值为输入的权值;
然后就是弗洛伊德求最短路的操作了。
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; const int mod=1e9+7; int n,m,x,a,b; int f[22][22]; char c; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) f[i][j]=(i!=j)?mod:0; for(int i=1;i<=n;++i) { scanf("%d",&x); if(i!=n) { f[i][i+1]=x; f[i+1][i]=x; } else { f[1][n]=x; f[n][1]=x; } } for(int i=1;i<=m;++i) { cin>>c;a=c-'A'+1; cin>>c;b=c-'A'+1; cin>>x; if(f[a][b]!=mod) f[a][b]=f[b][a]=max(x,f[a][b]); else f[a][b]=f[b][a]=x; } 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]); cin>>c;a=c-'A'+1; cin>>c;b=c-'A'+1; printf("%d",f[a][b]); return 0; }
如果你不开心,那我就把右边这个帅傻子分享给你吧,
你看,他这么好看,那么深情的望着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。