这道题最初博主理解错误,误以为学了某种文化就不能到排斥这种文化的地方去(明明也是这样写的好吧),实际上只用判断到达的国家是否排斥现在所在国家的文化,那就简单多了,Floyd 走起,下面是代码: #include <stdio.h> using namespace std; const int MAX=999999; const int MAXN=105; int n,k,m,s,t, c[MAXN], a[MAXN][MAXN], e[MAXN][MAXN], i,j,q,u,v,w; int main() { scanf("%d%d%d%d%d",&n,&k,&m,&s,&t); for(i=1;i<=n;i++) scanf("%d",&c[i]); for(i=1;i<=k;i++) for(j=1;j<=k;j++) scanf("%d",&a[i][j]); for(i=1;i<=n;i++) for(j=1;j<=n;j++){ if(i==j) e[i][j]=0; else e[i][j]=MAX; } for(i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); e[u][v]=w; e[v][u]=w; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i!=j&&a[c[j]][c[i]]==1) e[i][j]=MAX; for(q=1;q<=n;q++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i][j]>e[i][q]+e[q][j]) e[i][j]=e[i][q]+e[q][j]; if(e[s][t]<MAX) printf("%d\n",e[s][t]); else printf("-1\n"); return 0; }