QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#629076#4504. Book ClubjdelaureWA 76ms319952kbC112.7kb2024-10-11 03:00:472024-10-11 03:00:47

Judging History

你现在查看的是最新测评结果

  • [2024-10-11 03:00:47]
  • 评测
  • 测评结果:WA
  • 用时:76ms
  • 内存:319952kb
  • [2024-10-11 03:00:47]
  • 提交

answer

#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

uint16_t graphAsArray[20004][20004];
uint8_t graphAsGraph[20004][20004]; 
uint16_t graphNbEdges[20004];
uint16_t path[20004];

int nbPeople;

void sanityCheck() {
    for (int src = 0; src <= nbPeople*2+1; src++) {
        for (int i = 0; i < graphNbEdges[src]; i++) {
            int dst = graphAsArray[src][i];
            if (!graphAsGraph[src][dst]) {
                fprintf(stderr, "what the fuck %d %d\n", src, dst);
                printf("[%i][%i]\n", src, i);
            }
        }
    }
}

void addEdge(uint16_t src, uint16_t dst) {
    if (!graphAsGraph[src][dst]) {
        int index = graphNbEdges[src]++;
        graphAsGraph[src][dst] = index + 1;
        graphAsArray[src][index] = dst;

    }

    //sanityCheck();
}

void removeEdge(uint16_t src, uint16_t dst) {
    int index, replace;
    uint16_t newDst;

    if (graphAsGraph[src][dst]) {
        replace = --graphNbEdges[src];
        index = graphAsGraph[src][dst] - 1;
        newDst = graphAsArray[src][replace];

        graphAsGraph[src][dst] = 0;
        graphAsArray[src][index] = newDst;
        graphAsGraph[src][newDst] = index + 1;
    }

    //sanityCheck();
}

bool searchPath(uint16_t source, uint16_t target) {
    if (source == target)
        return true;
    
    for (int i = 0; i < graphNbEdges[source]; i++) {
        uint16_t dst = graphAsArray[source][i];
        if (path[dst] == (uint16_t)-1) {
            path[dst] = source;
            if (searchPath(dst, target))
                return true;
        }
    }

    return false;
}

int fordFulkerson(uint16_t source, uint16_t target) {
    uint16_t u, v;
    int maxFlow = 0;

    for (;;) {
        memset(path, -1, sizeof(path));
        if (!searchPath(source, target))
            break;

        //printf("%i %i\n", source, target);
        
        v = target;
        while (v != source) {
            u = path[v];
            removeEdge(u, v);
            addEdge(v, u);
            v = path[v];
        }

        maxFlow++;
    }

    return maxFlow;
}

int main(void) {
    //freopen("J2.in", "r", stdin);

    int nbDeclarations;
    int person, preference;
    scanf("%d %d", &nbPeople, &nbDeclarations);

    for (int i = 0; i < nbDeclarations; i++) {
        scanf("%d %d", &person, &preference);
        addEdge(person*2, preference*2+1);
    }

    for (int i = 0; i < nbPeople; i++) {
        addEdge(nbPeople*2, i*2);
        addEdge(i*2+1, nbPeople*2+1);
    }

    int result = fordFulkerson(nbPeople*2, nbPeople*2+1);
    if (result == nbPeople) {
        printf("YES\n");
    } else {
        printf("NO\n");
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3684kb

input:

5 5
0 1
1 2
2 3
3 4
4 0

output:

YES

result:

ok single line: 'YES'

Test #2:

score: 0
Accepted
time: 3ms
memory: 77576kb

input:

1000 5000
0 271
0 320
0 325
0 378
0 562
0 942
0 957
1 88
1 235
1 271
1 579
1 604
1 751
1 875
1 929
2 70
2 403
2 470
2 909
2 912
3 352
3 657
3 810
4 201
4 361
4 414
4 418
4 505
4 531
4 597
4 833
5 14
5 123
5 281
5 878
5 938
6 311
6 392
6 564
6 994
7 246
7 353
7 372
7 710
7 751
7 772
8 149
8 435
8 682...

output:

NO

result:

ok single line: 'NO'

Test #3:

score: 0
Accepted
time: 19ms
memory: 280392kb

input:

10000 10000
0 3378
1 8751
2 9999
3 7769
4 6001
5 9998
6 9311
7 9996
8 7722
9 1572
10 9994
11 3865
12 186
13 7614
14 9992
15 9991
16 4424
17 9807
18 5031
19 7909
20 4994
21 292
22 9990
23 8180
24 5837
25 9989
26 9554
27 7552
28 8027
29 5135
30 9988
31 4067
32 702
33 9984
34 8831
35 6971
36 7354
37 81...

output:

YES

result:

ok single line: 'YES'

Test #4:

score: 0
Accepted
time: 20ms
memory: 285984kb

input:

10000 10000
0 3378
1 8751
2 9999
3 7769
4 6001
5 9998
6 9311
7 9996
8 7722
9 1572
10 9994
11 3865
12 186
13 7614
14 9992
15 9991
16 4424
17 9807
18 5031
19 7909
20 4994
21 292
22 9990
23 8180
24 5837
25 9989
26 9554
27 7552
28 8027
29 5135
30 9988
31 4067
32 702
33 9984
34 8831
35 6971
36 7354
37 81...

output:

NO

result:

ok single line: 'NO'

Test #5:

score: 0
Accepted
time: 76ms
memory: 319952kb

input:

10000 20000
0 3378
0 6398
1 3271
1 6775
1 8751
2 9999
3 7769
4 1201
4 6001
4 6908
5 9997
6 9311
7 9995
8 2240
8 7722
9 1572
10 9994
11 3865
12 186
12 6999
12 8543
13 6075
13 6124
13 7614
13 8433
14 9986
15 3587
16 1761
16 3977
16 4424
16 5036
16 8714
16 9441
17 2109
17 9807
18 3502
18 5031
19 7909
2...

output:

NO

result:

ok single line: 'NO'

Test #6:

score: -100
Wrong Answer
time: 43ms
memory: 318888kb

input:

10000 20000
0 3378
0 6398
1 3271
1 6775
1 8751
2 9999
3 7769
4 1201
4 6001
4 6908
5 9997
6 9311
7 9995
8 2240
8 7722
9 1572
10 9994
11 3865
12 186
12 6999
12 8543
13 6075
13 6124
13 7614
13 8433
14 9986
15 3587
16 1761
16 3977
16 4424
16 5036
16 8714
16 9441
17 2109
17 9807
18 3502
18 5031
19 7909
2...

output:

NO

result:

wrong answer 1st lines differ - expected: 'YES', found: 'NO'