64pts求大佬条
查看原帖
64pts求大佬条
1345783
BK小鹿楼主2024/10/14 22:42

rt,莫名其妙WA3,MLE1,不知道哪错了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110;

int n, K, m, s, t;
int g[N][N], dis[N][N], c[N];
bool exclude[N][N];
int ans = 0x3f3f3f3f, cnt, pa[N];


void dfs(int u, int d)
{
    if (d + dis[s][u] >= ans) return;
    if (u == s) ans = d;
    else
    {
       for (int i = 1; i <= n; i ++ )
         if (g[i][u] < 0x3f3f3f3f)
         {
             bool fl = 1;
             for (int j = 1; j <= cnt; j ++ )
               if (exclude[pa[j]][c[i]])
               {
                   fl = 0;
                   break;
               }
             if (!fl) continue;
             pa[++ cnt] = c[i];
             dfs(i, d + g[i][u]);
             cnt -- ;
      }
    }
}

int main()
{
    memset(g, 0x3f, sizeof g);
    scanf("%d%d%d%d%d", &n, &K, &m, &s, &t);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &c[i]), g[i][i] = 0;
    for (int i = 1; i <= K; i ++ )
    {
      exclude[i][i] = 1;
      for (int j = 1; j <= K; j ++ )
        scanf("%d", &exclude[i][j]);
    }
    
    while (m -- )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        g[a][b] = g[b][a] = min(g[a][b], c);
    }
    
    memcpy(dis, g, sizeof dis);
    for (int k = 1; k <= n; k ++ )
      for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= n; j ++ )
            dis[i][j] = min(dis[i][k] + dis[k][j], dis[i][j]);
    
    pa[++ cnt] = c[t];
    dfs(t, 0);
    if (ans == 0x3f3f3f3f) ans = -1;
    printf("%d\n", ans);
    return 0;
}
2024/10/14 22:42
加载中...