• hdu 1690最短路


    就是建图,把题目描述的东东转换成一张图求最短路就行了,因为是随机询问,所以用floyd比较方便。不过打完之后一直WA,百思不得其解的情况下看了一下discuss,有人说得用long long,于是我马上改了交,果然过了……唉,以后看题还是得细心……

    /*
     * hdu1690/win.cpp
     * Created on: 2012-10-27
     * Author    : ben
     */
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    #include <stack>
    #include <string>
    #include <vector>
    #include <deque>
    #include <list>
    #include <functional>
    #include <numeric>
    #include <cctype>
    using namespace std;
    typedef long long LL;
    const int MAXN = 105;
    const LL INF  = 0x7fffffffffffffffLL;
    LL graph[MAXN][MAXN];
    int N;
    void Floyd() {
        int i, j, k;
        for (k = 0; k < N; k++) {
            for (i = 0; i < N; i++) {
                for (j = 0; j < N; j++) {
                    if(graph[i][k] < graph[i][j] - graph[k][j]) {
                        graph[i][j] = graph[i][k] + graph[k][j];
                    }
                }
            }
        }
    }
    void buildgraph(int &M) {
        fill_n((LL *)graph, MAXN * MAXN, INF);
        int L[4], C[4], pos[MAXN];
        for(int i = 0; i < 4; i++) {
            scanf("%d", &L[i]);
        }
        for(int i = 0; i < 4; i++) {
            scanf("%d", &C[i]);
        }
        scanf("%d%d", &N, &M);
        for(int i = 0; i < N; i++) {
            scanf("%d", &pos[i]);
        }
        for(int i = 0; i < N; i++) {
            graph[i][i] = 0;
            for(int j = i + 1; j < N; j++) {
                int t = abs(pos[i] - pos[j]);
                for(int k = 0; k < 4; k++) {
                    if(t <= L[k]) {
                        int p = C[k];
                        graph[i][j] = graph[j][i] = p;
                        break;
                    }
                }
            }
        }
    }
    
    
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("data.in", "r", stdin);
    #endif
        int T, M, a, b;
        scanf("%d", &T);
        for(int t = 1; t <= T; t++) {
            printf("Case %d:\n", t);
            buildgraph(M);
            Floyd();
            for(int i = 0; i < M; i++) {
                scanf("%d%d", &a, &b);
                if(graph[a - 1][b - 1] == INF) {
                    printf("Station %d and station %d are not attainable.\n", a, b);
                }else {
                    printf("The minimum cost between station %d and station %d is %I64d.\n", a, b, graph[a - 1][b - 1]);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    memcached构建集群分析之一
    linux使用getopt解析参数
    setbuffer和freopen做一个简单的日志组件
    setbuf和freopen
    编码规范的重要性
    c++的操作符格式记录
    do{...}while(0)的作用
    CF div2 321 C
    CF div2 321 B
    CF div2 321 A
  • 原文地址:https://www.cnblogs.com/moonbay/p/2742808.html
Copyright © 2020-2023  润新知