Submission #618178


Source Code Expand

#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <functional>
using namespace std;

#define INF 1000000000

typedef pair<int, int> Pair;

struct Edge {
    int to;
    int len;
    int penalty;
    int last;
};

int n;
int m;
int low, high;
int src;
int dst;
struct Edge e[2][300000];
vector<Edge> es[30000];
int mind[30000];
int dist[30000];

void dijkstra(int s) {
    priority_queue<Pair, vector<Pair>, greater<Pair> > q;

    fill(mind, mind+n, INF);
    mind[s] = 0;
    q.push(Pair(0, s));
    while (!q.empty()) {
        Pair p = q.top(); q.pop();
        int cost = p.first;
        int idx = p.second;

        if (mind[idx] < cost) continue;
        for (int i=0; i<es[idx].size(); i++) {
            Edge &e = es[idx][i];
            int u = e.to;
            int len = e.len;

            if (mind[u] > cost + len) {
                mind[u] = cost + len;
                q.push(Pair(mind[u], u));
            }
        }
    }
}

bool check(int x) {
    priority_queue<Pair, vector<Pair>, greater<Pair> > q;

    fill(dist, dist+n, INF);
    dist[src] = 0;
    q.push(Pair(0, src));
    while (!q.empty()) {
        Pair p = q.top(); q.pop();
        int cost = p.first;
        int idx = p.second;

        if (dist[idx] < cost) continue;
        for (int i=0; i<es[idx].size(); i++) {
            Edge &e = es[idx][i];
            int u = e.to;
            int len = e.len;
            int penalty = e.penalty;
            int last = e.last;

            if (dist[u] > cost + len && cost+penalty<= x-mind[last]) {
                dist[u] = cost + len;
                q.push(Pair(dist[u], u));
            }
        }
    }
    return dist[dst] <= x;
}

int main() {
    scanf("%d%d%d%d", &n, &m, &src, &dst);
    for (int i=0; i<m; i++) {
        int l;
        int s, s2;

        scanf("%d", &l);
        scanf("%d", &s);
        e[1][l-2].to = s;
        for (int j=0; j<l-1; j++) {
            scanf("%d", &e[0][j].to);
            if (j < l-2) e[1][l-3-j].to = e[0][j].to;
            else s2 = e[0][j].to;
        }

        for (int j=0; j<l-1; j++) {
            scanf("%d", &e[0][j].len);
            e[1][l-2-j].len = e[0][j].len;
            e[0][j].last = s2;
            e[1][j].last = s;
        }

        e[0][l-1].penalty = 0;
        e[1][l-1].penalty = 0;
        for (int j=l-2; j>=0; j--) {
            e[0][j].penalty = e[0][j+1].penalty + e[0][j].len;
            e[1][j].penalty = e[1][j+1].penalty + e[1][j].len;
        }

        es[s].push_back(e[0][0]);
        es[s2].push_back(e[1][0]);
        for (int j=1; j<l-1; j++) {
            es[e[0][j-1].to].push_back(e[0][j]);
            es[e[1][j-1].to].push_back(e[1][j]);
        }
    }

    dijkstra(dst);
    low = mind[src]-1;
    high = INF;
    while (high - low > 1) {
        int mid = (high+low)/2;
        if (check(mid)) high = mid;
        else low = mid;
    }

    printf("%d\n", high);
}

Submission Info

Submission Time
Task C - メンテナンス明け
User potetisensei
Language C++ (GCC 4.9.2)
Score 100
Code Size 3062 Byte
Status AC
Exec Time 272 ms
Memory 4140 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:83:42: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d%d", &n, &m, &src, &dst);
                                          ^
./Main.cpp:88:24: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &l);
                        ^
./Main.cpp:89:24: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &s);
                        ^
./Main.cpp:92:37: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", &e[0][j].to);
                                     ^
./Main.cpp:98:38: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_...

Judge Result

Set Name Subtask1 Subtask2
Score / Max Score 50 / 50 50 / 50
Status
AC × 52
AC × 6
Set Name Test Cases
Subtask1 small/00_sample00, small/00_sample01, small/00_sample02, small/10_small-0000, small/10_small-0001, small/10_small-0002, small/10_small-0003, small/10_small-0004, small/10_small-0005, small/10_small-0006, small/10_small-0007, small/10_small-0008, small/10_small-0009, small/10_small-0010, small/10_small-0011, small/10_small-0012, small/10_small-0013, small/10_small-0014, small/10_small-0015, small/10_small-0016, small/10_small-0017, small/10_small-0018, small/10_small-0019, small/30_max_small, small/40_simple_0000, small/40_simple_0001, small/40_simple_0002, small/40_simple_0003, small/40_simple_0004, small/40_simple_0005, small/40_simple_0006, small/40_simple_0007, small/40_simple_0008, small/40_simple_0009, small/40_simple_0010, small/40_simple_0011, small/40_simple_0012, small/40_simple_0013, small/40_simple_0014, small/40_simple_0015, small/40_simple_0016, small/40_simple_0017, small/40_simple_0018, small/40_simple_0019, small/90_dijkstra_killer_00, small/90_dijkstra_killer_01, small/91_tayama_killer_00, small/91_tayama_killer_01, small/91_tayama_killer_02, small/91_tayama_killer_03, small/91_tayama_killer_04, small/91_tayama_killer_05
Subtask2 large/20_large-00, large/20_large-01, large/20_large-02, large/20_large-03, large/20_large-04, large/31_max_large
Case Name Status Exec Time Memory
large/20_large-00 AC 240 ms 4136 KB
large/20_large-01 AC 242 ms 4140 KB
large/20_large-02 AC 239 ms 4136 KB
large/20_large-03 AC 252 ms 4100 KB
large/20_large-04 AC 272 ms 4124 KB
large/31_max_large AC 62 ms 3624 KB
small/00_sample00 AC 26 ms 1452 KB
small/00_sample01 AC 27 ms 1564 KB
small/00_sample02 AC 26 ms 1500 KB
small/10_small-0000 AC 27 ms 1568 KB
small/10_small-0001 AC 27 ms 1452 KB
small/10_small-0002 AC 27 ms 1444 KB
small/10_small-0003 AC 26 ms 1564 KB
small/10_small-0004 AC 27 ms 1444 KB
small/10_small-0005 AC 26 ms 1568 KB
small/10_small-0006 AC 28 ms 1448 KB
small/10_small-0007 AC 26 ms 1440 KB
small/10_small-0008 AC 27 ms 1444 KB
small/10_small-0009 AC 28 ms 1456 KB
small/10_small-0010 AC 27 ms 1444 KB
small/10_small-0011 AC 28 ms 1436 KB
small/10_small-0012 AC 28 ms 1440 KB
small/10_small-0013 AC 28 ms 1568 KB
small/10_small-0014 AC 28 ms 1448 KB
small/10_small-0015 AC 28 ms 1448 KB
small/10_small-0016 AC 27 ms 1444 KB
small/10_small-0017 AC 27 ms 1444 KB
small/10_small-0018 AC 28 ms 1444 KB
small/10_small-0019 AC 27 ms 1440 KB
small/30_max_small AC 27 ms 1444 KB
small/40_simple_0000 AC 27 ms 1568 KB
small/40_simple_0001 AC 25 ms 1568 KB
small/40_simple_0002 AC 27 ms 1448 KB
small/40_simple_0003 AC 26 ms 1440 KB
small/40_simple_0004 AC 25 ms 1572 KB
small/40_simple_0005 AC 27 ms 1444 KB
small/40_simple_0006 AC 25 ms 1440 KB
small/40_simple_0007 AC 26 ms 1440 KB
small/40_simple_0008 AC 27 ms 1444 KB
small/40_simple_0009 AC 27 ms 1432 KB
small/40_simple_0010 AC 27 ms 1444 KB
small/40_simple_0011 AC 27 ms 1444 KB
small/40_simple_0012 AC 27 ms 1448 KB
small/40_simple_0013 AC 26 ms 1444 KB
small/40_simple_0014 AC 27 ms 1440 KB
small/40_simple_0015 AC 25 ms 1560 KB
small/40_simple_0016 AC 26 ms 1448 KB
small/40_simple_0017 AC 27 ms 1432 KB
small/40_simple_0018 AC 26 ms 1440 KB
small/40_simple_0019 AC 28 ms 1432 KB
small/90_dijkstra_killer_00 AC 26 ms 1432 KB
small/90_dijkstra_killer_01 AC 26 ms 1564 KB
small/91_tayama_killer_00 AC 27 ms 1564 KB
small/91_tayama_killer_01 AC 28 ms 1556 KB
small/91_tayama_killer_02 AC 28 ms 1552 KB
small/91_tayama_killer_03 AC 27 ms 1436 KB
small/91_tayama_killer_04 AC 25 ms 1560 KB
small/91_tayama_killer_05 AC 26 ms 1568 KB