zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    bzoj1036 [ZJOI2008]树的统计Count(树链剖分)
    poj2348 Euclid's Game
    bzoj3575 [Hnoi2014]道路堵塞
    poj2484 A Funny Game
    bzoj2286 [Sdoi2011]消耗战
    虚树学习笔记
    bzoj4518 [Sdoi2016]征途
    node.js开发环境配置
    js中阻止事件冒泡和浏览器默认行为
    css3 background-clip和background-origin 区别
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/10397189.html
Copyright © 2011-2022 走看看