RT, 第10个点死活过不去,一直TLE, 是不是check函数写假了。。。。。谢谢大佬们!!
#include <bits/stdc++.h>
using namespace std;
#define N 110
const int inf = (int)2e9;
struct node{
int v, w, next;
} t[(N * N) << 1];
int f[N];
int bian = 0;
inline void add(int u, int v, int w){
t[++bian] = (node){v, w, f[u]}, f[u] = bian;
return ;
}
int n, k, m, s, ht;
int C[N];
int a[N][N]; // 瀹楁暀鍏崇郴
int d[N][N]; // 娌℃湁闄愬埗涓嬬殑璺濈
int alr[N], cnt = 0; // 宸茬粡瀛︿範杩囩殑瀹楁暀
bool vis[N];
void floyd(){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
for(int k = 1; k <= n; k++){
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
return ;
}
bool check(int v){
bool flag = 1;
for(int j = 1; j <= cnt; j++)
if(alr[j] == C[v] || a[C[v]][alr[j]] == 1){ // 宸茬粡瀛︿範杩囧畻鏁? 涓嶈兘鍘? 鎴栬€?鍜屽凡缁忓杩囩殑瀹楁暀鍐茬獊
flag = 0;
break ;
}
return flag;
}
int ans = inf;
void dfs(int now, int step){
if(step + d[now][ht] >= ans) return ;
if(now == ht){
ans = min(ans, step);
return ;
}
for(int i = f[now]; i; i = t[i].next){
int v = t[i].v;
if(!check(v) || vis[v]) continue;
alr[++cnt] = C[v];
vis[v] = 1;
dfs(v, step + t[i].w);
cnt--;
vis[v] = 0;
}
return ;
}
int main(){
cin >> n >> k >> m >> s >> ht;
for(int i = 1; i <= n; i++)
cin >> C[i];
for(int i = 1; i <= k; i++){
for(int j = 1; j <= k; j++)
cin >> a[i][j];
}
if(C[s] == C[ht]){
printf("-1");
return 0;
}
memset(d, 0x3f, sizeof(d));
for(int i = 1; i <= m; i++){
int x, y, w;
cin >> x >> y >> w;
add(x, y, w);
add(y, x, w);
d[x][y] = d[y][x] = min(d[x][y], w);
}
floyd();
alr[++cnt] = C[s];
vis[s] = 1;
dfs(s, 0);
if(ans == inf) ans = -1;
cout << ans << endl;
return 0;
}