zoukankan      html  css  js  c++  java
  • 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");
        }
    }
    


  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310495.html
Copyright © 2011-2022 走看看