• HDU-4848-Such Conquering


    这题就是深搜加剪枝,有一个很明显的剪枝,因为题目中给出了一个deadline,所以我们一定要用这个deadline来进行剪枝。
    题目的意思是求到达每个点的时间总和,当时把题看错了,卡了好久。
    剪枝一:走到这个点的时间+再走到下一个点的时间>该点的死线
    剪枝二:我们预测剪枝,因为我们要求的是总时间,所以我们每一步要走的点,都要被后面的点用上。我们每走一步的时间,后面点都要加上,因为它也走了。所以,就把后面的提前加上总时间,如果超出ans就返回。

    #include <cstdio>
    #include <cstring>
    int map[35][35];
    int vis[35], dead[35];
    const int INF = 0x3f3f3f3f;
    int n, ans;
    
    int min(int x,int y)
    {
        return x < y ? x : y;
    }
    
    void dfs(int u,int cnt,int time,int total)
    {
        if (!cnt) {
            ans = min(ans, total);
            return;
        }
        for (int i = 2; i <= n;i++) {
            if (!vis[i]&&time+map[u][i]>dead[i])
                return;
        }//走到这个点的时间+再走到到目标点的最短时间>死线
        for (int i = 2; i <= n;i++) {
            if (vis[i]||total+map[u][i]*cnt>=ans) {
                continue;
            }//这里假定我们走到下一个点的时间都是最短时间
            vis[i] = 1;
            dfs(i,cnt-1,time+map[u][i],total+cnt*map[u][i]);
            vis[i] = 0;
        }
    }
    
    void floyd()
    {
        for (int k = 1; k <= n;k++)
            for (int i = 1; i <= n;i++)
                for (int j = 1; j <= n;j++)
                    if (i!=j&&i!=k&&j!=k)
                        map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
    }
    
    int main()
    {
        while (scanf("%d",&n)!=EOF) {
            for (int i = 1; i <= n;i++)
                for (int j = 1; j <= n;j++)
                    scanf("%d", &map[i][j]);
            for (int i = 2; i <= n;i++)
                scanf("%d", &dead[i]);
            floyd();
            memset(vis,0,sizeof(vis));
            vis[1] = 1;
            ans = INF;
            dfs(1, n-1, 0, 0);
            printf("%d
    ", ans == INF ? -1 : ans);
        }
        return 0;
    }
    
  • 相关阅读:
    Windows Store App 主题动画
    Windows Store App 过渡动画
    Windows Store App 控件动画
    Windows Store App 近期访问列表
    Windows Store App 文件选取器
    Windows Store App 访问应用内部文件
    Windows Store App 用户库文件分组
    Windows Store App 获取文件及文件夹列表
    Windows Store App 用户库文件夹操作
    Windows Store App 用户库文件操作
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/10397189.html
Copyright © 2020-2023  润新知