DFS专题 下沙小面的(2)

这道题目有问题,4WA :

注意:
对于每组测试,Lele都是在站点0拉上乘客的。

最后看了题解,改了初始状态 AC 的。

View Code
# include <cstdio>
# include <cstdlib>
# include <cstring>

# define N 30 + 5

int n, k;
int g[N][N], des[N], min;
bool vis[N];

int cmp(const void *x, const void *y)
{
    return *(int*)x - *(int*)y;
}

void dfs(int cnt, int u, int d)
{
    if (cnt == k && min > d) { min = d; return ;}
    for (int i = 0; i < k; ++i) if (vis[i] == false)
    {
        vis[i] = true;
        dfs(cnt+1, des[i], d+g[u][des[i]]);
        vis[i] = false;
    }
}

void init(void)
{
    for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j)
        scanf("%d", &g[i][j]);

    scanf("%d", &k); //des[0] = 0;
    for (int i = 0; i < k; ++i)
        scanf("%d", &des[i]);
    qsort(des, k, sizeof(des[0]), cmp);

    /*  // 相同的不必搜两次
    int m = k, k = 1;
    for (int i = 1; i <= m; ++i)
        if (des[i] != des[i-1]) des[k++] = des[i];
    */
    memset(vis, false, sizeof(vis));
}

void solve(void)
{
    min = 0x7FFFFFFF;
    dfs(0, 0, 0);
    printf("%d\n", min);
}

int main()
{
    while (1)
    {
        scanf("%d", &n);
        if (!n) break;
        init();
        solve();
    }

    return 0;
}

/**/

原文地址:https://www.cnblogs.com/JMDWQ/p/2598451.html