• HDU 4284 Travel


          据说是TSP经典问题。。。可以用状态压缩做。但是看到数据量,就厚着脸皮上搜索了。。。先floyd预处理每对点间的最小消费,然后只考虑要去的城市就可以了,这样的话城市数最多16个。。。当时就暴搜了。。。但是注意城市1如果也需要工作的话不一定是第一个工作的城市。。。

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<cstdio>
    #include<cmath>
    
    #define INF 0X3f3f3f3f
    #define LL long long
    #define PB(a) push_back(a);
    #define CLR(a, b) memset(a, b, sizeof(a))
    
    using namespace std;
    
    const int N = 222;
    const int H = 33;
    
    struct City
    {
        int num, c, d;
    }ct[H];
    
    int g[N][N], m[H][H], h, n, mk;
    bool vis[H];
    
    void floyd()
    {
        int i, j, k;
        for(k = 1; k <= n; k ++)
        {
            for(i = 1; i <= n; i ++)
            {
                for(j = 1; j <= n; j ++)
                {
                    g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
                }
            }
        }
    }
    
    bool dfs(int u, int my)
    {
        int i, j, f = 1;
        for(i = 0; i < h; i ++) if(!vis[i])
        {
            f = 0;
            if(my - m[u][i] >= ct[i].d)
            {
                vis[i] = 1;
                if(dfs(i, my - m[u][i] - ct[i].d + ct[i].c)) return 1;
                vis[i] = 0;
            }
        }
        if(f && my < m[u][mk]) f = 0;
        return f;
    }
    
    int main()
    {
        int t, i, j, u, v, w, my, r;
        scanf("%d", &t);
        while(t --)
        {
            scanf("%d%d%d", &n, &r, &my);
            CLR(g, INF);
            for(i = 1; i <= n; i ++)
            {
                g[i][i] = 0;
            }
            for(i = 0; i < r; i ++)
            {
                scanf("%d%d%d", &u, &v, &w);
                g[u][v] = min(g[u][v], w);
                g[v][u] = g[u][v];
            }
            scanf("%d", &h);
            mk = -1;
            for(i = 0; i < h; i ++)
            {
                scanf("%d%d%d", &ct[i].num, &ct[i].c, &ct[i].d);
                if(ct[i].num == 1)
                {
                    mk = i;
                }
            }
            if(mk == -1)
            {
                mk = h;
                ct[h].num = 1;
                ct[h].c = 0;
                ct[h].d = 0;
                h ++;
            }
            floyd();
            for(i = 0; i < h; i ++)
            {
                for(j = 0; j < h; j ++)
                {
                    m[i][j] = g[ct[i].num][ct[j].num];
                }
            }
            CLR(vis, 0);
            if(dfs(mk, my)) puts("YES");
            else puts("NO");
        }
    }
    


  • 相关阅读:
    695. 岛屿的最大面积(深搜)
    147. 对链表进行插入排序(排序)
    566. 重塑矩阵(模拟)
    238. 除自身以外数组的乘积(前后缀积)
    29.Java基础_接口
    C++ STL queue
    C++ STL stack
    C++ STL string
    C面向接口编程和C++多态案例
    单例模式入门
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310495.html
Copyright © 2020-2023  润新知