原题链接:https://www.luogu.org/problem/show?pid=2009
做这道题的时候,看了一眼数据范围,n<=20,额,一般的Floyd不应该是100—200左右的吗,这个不会是有什么其他算法吧。。。
仔细审题后,好像没啥问题,直接字符转数字,Floyd直接上,然后就华丽的GG了,50分。
因为此题有可能有自环,而且每条边都只要最大值,于是就在前面加了一个特判边权不为无限大的时候,就取最大值。
然而还是不对,仔细看了半天,没看出错来,把手打的一串9改成常量inf后,居然A了,事后才发现,填数组的时候有8个9,判断的时候只输入了7个9。。。。。。
总体算法不难,注意好一些细节,就是个Floyd板子题
#include<cstdio> const int inf=9999999; int e[25][25],w,n,m; char s[5],t[5]; int max(int x,int y) { return x>y ? x : y; } int min(int x,int y) { return x<y ? x : y; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i!=j) e[i][j]=inf; } } for(int i=1;i<n;i++) { scanf("%d",&e[i][i+1]); e[i+1][i]=e[i][i+1]; } scanf("%d",&e[n][1]);e[1][n]=e[n][1]; for(int i=1;i<=m;i++) { scanf("%s %s %d",s,t,&w); int x=s[0]-‘A‘+1,y=t[0]-‘A‘+1; if(e[x][y]!=inf) e[x][y]=max(e[x][y],w); else e[x][y]=w; e[y][x]=e[x][y]; } for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { e[i][j]=min(e[i][j],e[i][k]+e[k][j]); e[j][i]=e[i][j]; } } } scanf("%s %s",s,t); int x=s[0]-‘A‘+1,y=t[0]-‘A‘+1; printf("%d",e[x][y]); return 0; }
时间: 2024-10-24 10:10:54