답안 #51270

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
51270 2018-06-17T10:53:49 Z Kubalionzzale 관광 (NOI14_sightseeing) C++11
15 / 25
3489 ms 157392 KB
    #include <iostream>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <functional>
     
    //std::vector< std::vector< std::pair<int, int> > > g(500010);
    int ans[500010] = { 0 }, start[500010] = { 0 };
    std::pair<int, std::pair<int, int> > edge[8000010];
    int n, m, q;
     
    void bfs()
    {
        std::set<std::pair<int, int> , std::greater<std::pair<int, int> > > set;
        set.insert(std::make_pair(2e8, 0));
        bool visited[500010] = { 0 };
     
        int curNode, curVal, nextVal, nextNode;
        while (set.empty() == false)
        {
            std::pair<int, int> top = *set.begin();
            curNode = top.second;
            curVal = top.first;
            set.erase(set.begin());
     
      //      std::cout << curNode << " " << curVal << "\n";
     
            if (visited[curNode])
                continue;
            else
                visited[curNode] = 1;
     
            for (int i = start[curNode]; i < m; ++i)
            {
                if (edge[i].first != curNode)
                    break;
                nextVal = edge[i].second.first;
                nextNode = edge[i].second.second;
                if (std::min(nextVal, curVal) > ans[nextNode])
                {
                    ans[nextNode] = std::max(ans[nextNode], std::min(nextVal, curVal));
                    set.insert(std::make_pair(std::min(nextVal, curVal), nextNode));
                }
            }
        }
    }
     
    int main()
    {
        std::ios_base::sync_with_stdio(0);
        std::cin.tie(0);
    //    scanf("%d%d%d", &n, &m, &q);
        std::cin >> n >> m >> q;
     
        int x, y, quality;
        for (int i = 0; i < m; ++i)
        {
    //        scanf("%d%d%d", &x, &y, &quality);
            std::cin >> x >> y >> quality;
            --x,
            --y;
     
     
            edge[i] = std::make_pair(x, std::make_pair(quality, y));
            edge[m + i] = std::make_pair(y, std::make_pair(quality, x));
        }
        m *= 2;
     
        std::sort(edge, edge + m);
     
        int node[500010];
        for (int i = 0; i < q; ++i)
        {
    //        scanf("%d", &node[i]);
            std::cin >> node[i];
        }
     
        for (int i = 0; i < n; ++i)
        {
            start[i] = std::lower_bound(edge, edge + m, std::make_pair(i, std::make_pair(0, 0))) - edge;
        }
     
        bfs();
     
        for (int i = 0; i < q; ++i)
        {
    //        printf("%d\n", ans[node[i] - 1]);
            std::cout << ans[node[i] - 1] << "\n";
        }
    }
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 888 KB Output is correct
2 Correct 3 ms 1000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 1084 KB Output is correct
2 Correct 3 ms 1084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 49 ms 3360 KB Output is correct
2 Correct 42 ms 3360 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3489 ms 113700 KB Output is correct
2 Runtime error 1353 ms 157392 KB Execution killed with signal 11 (could be triggered by violating memory limits)