思路:
这题数据比较水,floyed即可,注意建图
C o d e Code Code:
#include<cstdio>
#include<iostream>
#include<cstring>
#define for(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
int x,y,z,n,c[1000],f[1000][1000],k,m,s,t,a[1000][1000];
int main()
{
scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);
for(i,1,n)
scanf("%d",&c[i]);
for(i,1,n)
for(j,1,n)
f[i][j]=2147482;//初始化
for(i,1,k)
for(j,1,k)
scanf("%d",&a[i][j]);
for(i,1,m){
scanf("%d%d%d",&x,&y,&z);
if(!a[c[y]][c[x]]&&c[y]!=c[x])f[x][y]=min(f[x][y],z);//判断文化建边
if(!a[c[x]][c[y]]&&c[y]!=c[x])f[y][x]=min(f[y][x],z);
}
for(k,1,n)//floyed
for(i,1,n)
for(j,1,n)
{
if(i!=j&&j!=k&&k!=j&&f[i][j]>f[i][k]+f[j][k])
f[i][j]=f[i][k]+f[k][j];
}
if(f[s][t]==2147482||c[s]==c[t])//无解
printf("-1");
else printf("%d",f[s][t]);//有解
return 0;
}