P2009 跑步
认真读题。
弗洛伊德,
初始化为极大值,如果是自己到自己则赋值为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;
}
如果你不开心,那我就把右边
这个帅傻子分享给你吧,
你看,他这么好看,那么深情的望着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。

浙公网安备 33010602011771号