文化之旅
[Time Gate]
https://www.luogu.org/problemnew/show/P1078
【解题思路】 floyd algorithm
【code】
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 int i,j,n,k,m,s,t,x,y,z; 6 int u,v,d; 7 const int INF=233333333; 8 int c[505],a[505][505]; 9 long long f[505][105]; 10 inline long long Min(long long a,long long b){ 11 return a<b?a:b; 12 } 13 int main(){ 14 //freopen("1078.in","r",stdin); 15 //freopen("1078.out","w",stdout); 16 scanf("%d%d%d%d%d",&n,&k,&m,&s,&t); 17 for(register int i=1;i<=n;i++) 18 scanf("%d",&c[i]); 19 if(c[s]==c[t]){ 20 printf("-1\n"); 21 return 0; 22 } 23 for(register int i=1;i<=n;i++) 24 for(register int j=1;j<=n;j++) 25 f[i][j]=INF; 26 for(register int i=1;i<=k;i++) 27 for(register int j=1;j<=k;j++) 28 scanf("%d",&a[i][j]); 29 for(register int i=1;i<=m;i++){ 30 scanf("%d%d%d",&u,&v,&d); 31 if(f[u][v]>d){ 32 if(a[c[u]][c[v]]==0&&c[u]!=c[v])f[u][v]=d; 33 if(a[c[v]][c[u]]==0&&c[u]!=c[v])f[v][u]=d; 34 } 35 } 36 for(register int k=1;k<=n;k++) 37 for(register int i=1;i<=n;i++) 38 for(register int j=1;j<=n;j++) 39 if (f[i][k]+f[k][j]<f[i][j]) 40 f[i][j]=f[i][k]+f[k][j]; 41 if(f[s][t]==INF)printf("-1\n"); 42 else printf("%lld\n",f[s][t]); 43 return 0; 44 }