#include <stdio.h>
#define N 2005
int t, n, m, i, j, k, l, a, b, x, y;
int c[N], h[N], f[N][N], q[N*N];
struct AB{
    int a, b, n;
} d[N*2];
void cun(int a, int b){
    d[++k].a = a, d[k].b = b;
    d[k].n = h[a], h[a] = k;
}//不会邻接表,也可以用二维数组存储
int main(){
    scanf("%d", &t);
    while(t--){
        scanf("%d%d", &n, &m);
        for(i=1; i<=n; i++){
            scanf("%d", &c[i]);
            for(j=1; j<=n; j++) f[i][j] = 0;
        }//注意赋初值,数组比较大不要memset
        for(i=k=0; i<=n; i++) h[i] = 0;
        for(i=1; i<=m; i++){
            scanf("%d%d", &a, &b);
            cun(a, b);
            cun(b, a);
        }
        f[1][n] = 1, q[1] = 1*N + n;
        for(i=j=1; i<=j; i++){
            a = q[i]/N, b = q[i]%N;//当前状态
            for(k=h[a]; k; k=d[k].n){
                for(l=h[b]; l; l=d[l].n){
                    x = d[k].b, y = d[l].b;//后继状态
                    if(c[x]==c[y] || f[x][y]) continue;
                    f[x][y] = f[a][b] + 1;//记录最小步数
                    q[++j] = x*N + y;
                }
            }
        }
        printf("%d\n", f[n][1]-1);
    }
    return 0;
}

作者 crxis

发表回复