文化之旅

[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 }

 

 
posted @ 2019-07-15 12:25  GTR_PaulFrank  阅读(95)  评论(0编辑  收藏  举报